Large-scale website technical architecture - reading notes

5 elements of the core architecture of a large website:

 

1. Performance

 

1. Web front-end performance optimization .

 

(1) Browser access optimization:

 

  ①Reduce http requests : Because http is stateless, the overhead of each request is relatively expensive (need to establish a communication link and perform data transmission, and the server needs to start a separate thread for each http request to process); reduce The main method of http is to merge CSS, merge JS, and merge pictures (CSS sprites, using offset to locate images);

 

  ②Use browser cache : Set the Cache-Control and Expires properties in the http header;

 

  ③Enable compression : Gzip compression can be enabled for html, css, and js files, which can achieve higher compression efficiency, but compression will cause certain pressure on the server and browser;

 

  ④ Put CSS at the top of the page and JS at the bottom of the page: the browser will start rendering the entire page after downloading all the CSS, so it is best to put the CSS at the top of the page; and the browser will execute it immediately after loading the JS , it may block the entire page and cause the page to display slowly, so it is best to put JS at the bottom of the page;

 

  ⑤Reduce cookie transmission: On the one hand, too large cookies will seriously affect data transmission; on the other hand, it is meaningless to send cookies for access to some static resources (such as CSS, JS, etc.);

 

(2) CDN acceleration:

       A CDN (Content Delivery Network) is still a cache, which caches data closest to the user so that the user can get the data as quickly as possible. This is the so-called "first hop for network access".

  CDN only caches frequently accessed hot content (such as images, videos, CSS, JS scripts, etc.), which can greatly speed up user access and reduce data center load.

 

(3) Reverse proxy:

  The reverse proxy server is located in the website computer room, and the proxy website Web server receives the Http request and forwards the request.

  A reverse proxy server has the following functions:

  ①保护网站安全:任何来自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请求转移到其他服务器上;

 

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

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

 

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

 

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

 

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

Guess you like

Origin http://10.200.1.11:23101/article/api/json?id=326711335&siteId=291194637