`

大型网站技术架构-读书笔记

阅读更多

大型网站核心架构5要素:

 

一、性能

 

1.Web前端性能优化

 

(1)浏览器访问优化:

 

  ①减少http请求:因为http是无状态的,每次请求的开销都比较昂贵(需要建立通信链路、进行数据传输,而服务器端对于每个http请求都需要启动独立的线程去处理);减少http的主要手段是合并CSS、合并JS、合并图片(CSS精灵,利用偏移定位image);

 

  ②使用浏览器缓存:设置http头中Cache-Control和Expires属性;

 

  ③启用压缩:可以对html、css、js文件启用Gzip压缩,可以达到较高的压缩效率,但是压缩会对服务器及浏览器产生一定的压力;

 

  ④CSS放页面最上面,JS放页面最下面:浏览器会在下载完全部CSS之后才开始对整个页面进行渲染,因此最好将CSS放在页面最上面;而浏览器在加载JS后会立即执行,有可能会阻塞整个页面,造成页面显示缓慢,因此最好将JS放在页面最下面;

 

  ⑤减少Cookie传输:一方面,太大的Cookie会严重影响数据传输;另一方面,对于某些静态资源的访问(如CSS、JS等)发送Cookie没有意义;

 

(2)CDN加速:

       CDN(内容分发网络)仍然是一个缓存,它将数据缓存在离用户最近的地方,便于用户以最快速度获取数据。即所谓的“网络访问第一跳”。

  CDN只将访问频度很高的热点内容(例如:图片、视频、CSS、JS脚本等访问频度很高的内容)进行缓存,可以极大地加快用户访问速度,减少数据中心负载。

 

(3)反向代理:

  反向代理服务器位于网站机房,代理网站Web服务器接收Http请求,对请求进行转发。

  反向代理服务器具有以下功能:

  ①保护网站安全:任何来自Internet的请求都必须先经过代理服务器;

 

  ②通过配置缓存功能加速Web请求:减轻真实Web服务器的负载压力;

 

  ③实现负载均衡:均衡地分发请求,平衡集群中各个服务器的负载压力;

 

2.应用服务器性能优化

 

(1)分布式缓存

网站性能优化第一定律:优先考虑使用缓存优化性能。缓存是指将数据存储在相对较高访问速度的存储介质中(如内存),以供系统进行快速处理响应用户请求。

 

       ①缓存本质是一个内存Hash表,数据以(Key,Value)形式存储在内存中。

 

  ②缓存主要用来存放那些读写比很高、很少变化的数据,如商品的类目信息、热门商品信息等。这样,应用程序读取数据时,先到缓存中取,如缓存中没有或失效,再到数据库中取出,重新写入缓存以供下一次访问。因此,可以很好地改善系统性能,提高数据读取速度,降低存储访问压力。

 

  ③分布式缓存架构:一方面是以以JBoss Cache为代表的互相通信派;另一方面是以Memcached为代表的互不通信派;

 

  JBoss Cache需要将缓存信息同步到集群中的所有机器,代价比较大;而Memcached采用一种集中式的缓存集群管理,缓存与应用分离部署,应用程序通过一致性Hash算法选择缓存服务器远程访问缓存数据,缓存服务器之间互不通信,因而集群规模可以轻易地扩容,具有良好的伸缩性。

 

(2)异步操作

 

  ①使用消息队列将调用异步化,可改善网站的扩展性,还可改善网站性能;

 

  ②消息队列具有削峰的作用->将短时间高并发产生的事务消息存储在消息队列中,从而削平高峰期的并发事务;

 

(3)使用集群

 

  ①在高并发场景下,使用负载均衡技术为一个应用构建多台服务器组成的服务器集群;

 

  ②可以避免单一服务器因负载压力过大而响应缓慢,使用户请求具有更好的响应延迟特性;

 

  ③负载均衡可以采用硬件设备,也可以采用软件负载。商用硬件负载设备(例如出名的F5)成本通常较高(一台几十万上百万很正常),所以在条件允许的情况下我们会采用软负载,软负载解决的两个核心问题是:选谁、转发,其中最著名的是LVS(Linux Virtual Server)

 

(4)代码优化

 

  ①多线程:使用多线程的原因:一是IO阻塞,二是多CPU,都是为了最大限度地利用CPU资源,提高系统吞吐能力,改善系统性能;

 

  ②资源复用:目的是减少开销很大的系统资源的创建和销毁,主要采用两种模式实现:单例(Singleton)和对象池(Object Pool)。例如,在.NET开发中,经常使用到的线程池,数据库连接池等,本质上都是对象池。

 

  ③数据结构:在不同场合合理使用恰当的数据结构,可以极大优化程序的性能。

 

  ④垃圾回收:理解垃圾回收机制有助于程序优化和参数调优,以及编写内存安安全的代码。这里主要针对Java(JVM)和C#(CLR)一类的具有GC(垃圾回收机制)的语言。

 

二、可用性

 

1.高可用的架构

 

  目前,通常企业级应用系统(特别是政府部门和大企业的应用系统)一般会采用安规的软硬件设备,如IOE(IBM的小型机、Oracle数据、EMC存储设备)系列。而一般互联网公司更多地采用PC级服务器(x86),开源的数据库(MySQL)和操作系统(Linux)组建廉价且高容错(硬件故障是常态)的应用集群。

 

  (1)设计的目的?

 

  保证服务器硬件故障服务依然可用,数据依然保存并能够被访问。

 

  (2)主要的手段?

 

  数据和服务的①冗余备份以及②失效转移:

 

  对于服务而言,一旦某个服务器宕机,就将服务切换到其他可用的服务器上;

 

  对于数据而言,如果某个磁盘损坏,就从备份的磁盘(事先就做好了数据的同步复制)读取数据。

 

2.高可用的应用

 

  应用层处理网站应用的业务逻辑,应用的一个最显著的特点是:应用的无状态性。

 

  (1)通过负载均衡进行无状态服务的失效转移

 

  (2)应用服务器集群的Session管理

 

Web应用中将上下文对象称为会话(Session),单机情况下由部署在服务器上得Web容器(如IIS、Tomcat、JBoss等)管理。在使用了负载均衡的集群环境中,由于请求的分发是随机的,所以保证每次请求依然能够获得正确的Session比单机时要复杂得多。

 

Session服务器:利用独立部署的Session服务器(集群)统一管理Session,应用服务器每次读写Session时,都访问Session服务器。这种方案实际上是将应用服务器的状态分离,分为无状态的应用服务器和有状态的Session服务器。

 

  对于有状态的Session服务器,一种较简单的方法是利用分布式缓存(如Memcached、Redis等)、数据库等,在这些产品的基础上进行封装,使其符合Session的存储和访问要求。

 

3.高可用的服务

 

  ①分级管理:核心应用和服务具有更高的优先级,比如用户及时付款比能否评价商品更重要;

 

  ②超时设置:设置服务调用的超时时间,一旦超时后,通信框架抛出异常,应用程序则根据服务调度策略选择重试or请求转移到其他服务器上;

 

  ③异步调用:通过消息队列等异步方式完成,避免一个服务失败导致整个应用请求失败的情况。

    不是所有服务都可以异步调用,对于获取用户信息这类调用,采用异步方式会延长响应时间,得不偿失。对于那些必须确认服务调用成功后才能继续进行下一步的操作的应用也不适合异步调用。

 

  ④服务降级:网站访问高峰期间,为了保证核心应用的正常运行,需要对服务降级。

 

  降级有两种手段:一是拒绝服务,拒绝较低优先级的应用的调用,减少服务调用并发数,确保核心应用的正常运行;二是关闭功能,关闭部分不重要的服务,或者服务内部关闭部分不重要的功能,以节约系统开销,为核心应用服务让出资源;

 

  ⑤幂等性设计:保证服务重复调用和调用一次产生的结果相同;

分享到:
评论

相关推荐

    《大型网站技术架构》读书笔记.pdf

    《大型网站技术架构》读书笔记思维导图,初始架构、服务数据分离、缓存改善性能、服务器集群化、数据库读写分离、反向代理CDN、分布式FS/DBS、NOSQL和搜索引擎、业务切分

    大型网站技术架构+读书笔记

    大型网站技术架构_核心原理与案例分析_李智慧 pdf

    大型网站技术架构笔记

    李智慧老师的大型网站技术架构的读书笔记

    大型分布式网站架构设计与实践.pdf

    文是学习大型分布式网站架构的技术总结。对架构一个高性能,高可用,可伸缩,可扩展的分布式网站进行了概要性描述,并给出一个架构参考。一部分为读书笔记,一部分是个人经验总结。对大型分布式网站架构有很好的参考...

    Reading-Notes:读书笔记们

    学习笔记都在这里了 好好学习,天天向上!生命不息,阅读不止! 本仓库参考以下书籍或资料 JavaScript高级程序设计(第三版) ...大型网站技术架构核心原理与案例分析 锋利的jQuery JavaScript设计模式与开发实践

    java面试大全-黑马

    去掉了EJB 2.x、JSF等无用内容或过时内容,补充了数据结构和算法、大型网站技术架构、设计模式、UML、Spring MVC等内容并对很多知识点进行了深入的剖析,例如hashCode方法的设计、垃圾收集、并发编程、数据库事务等...

    基于微服务的软件架构模式

    今天阅读了两篇关于微服务的文章,总结一些笔记,不敢贸然翻译:一是因为水平不够,翻译的过程会丢掉作者的原意;二是因为技术翻译是一个略微吃力不讨好的活。微服务(microservices)这个概念不是新概念,很多公司...

    react-github-notetaker

    一个用例(如果你添加了我们不会在这个项目中做的身份验证)是在技术面试中为候选人做笔记。 作为我们开始之前的一些注意事项。 请记住,当您拥有大型、数据量大的应用程序时,Flux 真的很出色。 虽然我们可以说有...

    金鼎餐饮通 v3.0.0.zip

    3)该系统采用B/S技术架构,安装部署方便,一处安装,多处使用,并支持普通PC、笔记本、苹果电脑、平板电脑等多种设备。 5)该系统后端采用.Net企业级应用软件开发技术,前端采用Ajax无刷新技术,后端技术可靠稳定...

    github-notetaker

    一个用例(如果你添加了我们不会在这个项目中做的身份验证)是在技术面试中为候选人做笔记。 作为我们开始之前的一些注意事项。 请记住,当您拥有大型、数据量大的应用程序时,Flux 真的很出色。 虽然我们可以说有...

    samples:准备在您的项目中使用的WarpJS代码示例

    专为生产级项目而建,它提供了从小型项目到大型项目的所有开发内容,可以直接从笔记本电脑直接进行开发,并具有独特的开发经验,并且速度很快。 它与我们的SaaS连接,后者为开发团队提供了进入任何云(或内部部署)...

    react-notetaker

    #### Objectives该项目的目的是使您熟悉Flux架构。 在这个项目中,我们将重新创建应用程序。 用户可以输入任何github用户名,然后将其路由到一个页面,在该页面上他们可以查看该用户的信息,存储库,并可以为特定的...

Global site tag (gtag.js) - Google Analytics