系统分流
简介
现代的企业级或互联网系统,“分流”是必须要考虑的设计,分流所使用手段数量之多、涉及场景之广,可能连它的开发者都未能完全意识到,常见的分流手段有:客户端缓存、域名解析、传输链路、内容分发网络、负载均衡、服务端缓存等
客户端缓存
常见的缓存方式有两种,强制缓存
和协商缓存
,无论是强制缓存还是协商缓存,它们的原理都是在服务器对客户端请求的响应中附带一些条件,要求客户端在遇到相同的请求时,先判断一下是否满足,如果满足,就直接用上一次服务器给予的响应来代替,不必重新访问
强制缓存
HTTP的强制缓存对一致性问题的处理策略就如它的名字一样,十分直接,它会在指定的时间范围内假设资源的内容和状态一定不会被改变,在这个时间范围内,会一直持有和使用该资源的本地缓存副本,Http协议中有一下两类Header实现强制缓存
- Expires
Expires: Mon,11 Nov 2019 08:36:00 GMT
- Cache-Control
如果Expires和Cache-Control同时存在,并且语义存在冲突,则会以Cache-Control为准
主要参数为s-maxage
,max-age
,publice
,private
,public
,no-cache
,no-store
等
协商缓存
强制缓存是基于时效性的,而协商缓存是一种基于变化监测的缓存机制,在一致性上会有比强制缓存有更好的表现.
协商缓存有两种变动检查机制,分别是根据资源的修改时间进行检查,以及根据资源唯一标识是否变化进行检查,它们都是靠一组成对出现的请求头、响应头来实现的
- Last-Modified和If-Modified-Since
Last-Modified
是服务端的响应头,用于告诉客户端这个资源的最后修改时间。对于带有这个响应头的资源,当客户端需要再一次请求时,会通过If-Modified-Since
把之前收到的资源最后修改时间发送会服务端
如果此时服务端发现资源在该时间后没有被修改过,就只要返回一个 304/Not Modified 的响应即可,无须附带消息体,达到节省流量的目的,如下所示:
如果此时服务端发现资源在该时间之后有变动,就会返回 200/OK 的完整响应,在消息体中包含最新的资源,如下所示:HTTP/1.1 304 Not Modified Cache-Control: public, max-age=600 Last-Modified: Wed, 8 Apr 2020 15:31:30 GMT
HTTP/1.1 200 OK Cache-Control: public, max-age=600 Last-Modified: Wed, 8 Apr 2020 15:31:30 GMT Content
- ETag和If-None-Match
HTTP 响应头是资源的特定版本的标识符。这可以让缓存更高效,并节省带宽,因为如果内容没有改变,Web 服务器不需要发送完整的响应。而如果内容发生了变化,使用 ETag 有助于防止资源的同时更新相互覆盖(“空中碰撞”)
ETag是HTTP中一致性最强的缓存机制,但是同时它也是性能最差的缓存机制,在每一次请求时,服务端都必须对资源进行哈希计算,相比之下要比只是简单获取修改时间的方式,开销要大很多
域名解析
当在一个域名下配置多条不同的记录时,权威域名服务器可以根据自己的策略来进行选择,典型的应用是智能路线:根据访问者所处的不同地区(譬如华北、华南、东北)、不同服务商(譬如电信、联通、移动)等因素来确定返回最合适的记录,将访问者路由到最合适的数据中心,达到智能加速的目的
传输链路
- 减少请求数量
请求每次都需要建立链路进行数据传输,这些开销很昂贵,减少请求的数量可有效提高访问性能。常见的手段包括- 雪碧图
- CSS、JS文件合并/内联
- 文段文档
- 媒体(图片、音频)内联
- 合并Ajax请求
- 扩大并发请求数
- 扩大并发请求
如果希望更快地加载大量图片或其他资源,需要进行域名分片(Domain Sharding),将图片同步到不同主机或者同一主机的不同域名上 - 启用压缩传输
启用压缩能够大幅度减少需要在网络上传输的内容大小,节省网络流量 - 按重要性调节资源优先级
将最重要的、马上就要使用的、对客户端展示影响大的资源,放在HTML的头部,以便优先下载
内容分发网络(CDN)
内容分发网络(CDN)是一个互连服务器网络,可加快数据密集型应用程序的网页加载速度。CDN 可以表示内容分发网络或内容分配网络。当用户访问某个网站时,来自该网站服务器的数据必须通过互联网传输到用户的计算机。如果用户距离该服务器较远,则加载大文件(例如视频或网站图像)将需要很长时间。相反,如果网站内容存储在距离用户较近的 CDN 服务器上,就可以更快到达他们的计算机。
CDN 优势
- 加快页面加载速度
如果您的页面加载速度太慢,网站流量可能会减少。CDN 可以降低跳出率并增加用户在您网站上停留的时间 - 降低带宽成本
带宽成本是一笔巨大的开支,因为每个传入的网站请求都会消耗网络带宽。通过缓存和其他优化,CDN 可以减少原始服务器必须提供的数据量,从而降低网站所有者的托管成本 - 提高内容可用性
同一时间的访客过多或网络硬件故障可能会导致网站崩溃。CDN 服务可以处理更多 Web 流量并降低 Web 服务器的负载。此外,如果一台或多台 CDN 服务器离线,其他运营服务器可以替换它们,以确保服务不中断 - 提高网站安全性
分布式拒绝服务(DDoS)攻击试图通过向网站发送大量虚假流量来关闭应用程序。CDN 可以通过在多个中间服务器之间分配负载来处理此类流量峰值,从而降低对原始服务器的影响
分发方式
- 主动分发(Push)
分发由源站主动发起,将内容从源站或者其他资源库推送到用户边缘的各个CDN缓存节点上 - 被动回源(Pull)
被动回源由用户访问触发,是全自动、双向透明的资源缓存过程。这种分发方式是小型站点使用CDN服务的主流选择,如果不是自建CDN,而是采用云厂商的CDN服务,则多数采用的就是这种方式
CDN的工作原理
内容分发网络(CDN)通过在多个地理位置建立一个入网点(PoP)或一组 CDN 边缘服务器来工作。这个分布在不同地理位置的网络基于缓存、动态加速和边缘逻辑计算的原则工作
负载均衡
负载均衡是在支持应用程序的资源池中平均分配网络流量的一种方法。负载均衡器是位于用户与服务器组之间的设备,充当不可见的协调者,确保均等使用所有资源服务器
均衡策略与实现
- 轮循均衡(Round Robin)
- 权重轮循均衡(Weighted Round Robin)
- 随机均衡(Random)
- 权重随机均衡(Weighted Random)
- 一致性哈希均衡(Consistency Hash)
- 响应速度均衡(Response Time)
- 最少连接数均衡(Least Connection)
服务端缓存
缺点
- 开发
引入缓存会提高系统复杂度,因为要考虑缓存的失效、更新、一致性等问题 - 运维
缓存会掩盖一些缺陷,让问题在更远的时间以后,出现在距离发生现场更远的位置上 - 安全
缓存可能会泄漏某些保密数据,也是容易受到攻击的薄弱点
优点
- 缓解CPU压力
把方法运行结果存储起来、把原本要实时计算的内容提前算好、把一些公用的数据进行复用,这可以节省 CPU 算力,顺带提升响应性能 - 缓解I/O压力
把原本对网络、磁盘等较慢介质的读写访问变为对内存等较快介质的访问,将原本对单点部件(如数据库)的读写访问变为到可扩缩部件(如缓存中间件)的访问,顺带提升响应性能
缓存属性
- 吞吐量
缓存的吞吐量使用 OPS 值(每秒操作数,Operations per Second,ops/s)来衡量,反映了对缓存进行并发读、写操作的效率,即缓存本身的工作效率高低 - 命中率
缓存的命中率即成功从缓存中返回结果次数与总请求次数的比值,反映了引入缓存的价值高低,命中率越低,引入缓存的收益越小,价值越低 - 扩展功能
缓存除了基本读写功能外,还提供哪些额外的管理功能,譬如最大容量、失效时间、失效事件、命中率统计,等等 - 分布式支持
缓存可分为“进程内缓存”和“分布式缓存”两大类,前者只为节点本身提供服务,无网络访问操作,速度快但缓存的数据不能在各个服务节点中共享,后者则相反
缓存风险
- 缓存穿透
如果查询的数据在数据库中根本不存在,缓存里自然也不会有,这类请求的流量每次都不会命中,且每次都会触及末端的数据库,缓存就起不到缓解压力的作用了,这种现象称为缓存穿透 - 缓存击穿
如果缓存中某些热点数据忽然因某种原因失效了,譬如典型地由于超期而失效,此时又有多个针对该数据的请求同时发送过来,这些请求将全部未能命中缓存,都到达真实数据源中去,导致其压力剧增,这种现象被称为缓存击穿 - 缓存雪崩
在缓存中大批不同的数据在短时间内一起失效,导致这些数据的请求都击穿缓存到达数据源,同样令数据源在短时间内压力剧增 - 缓存污染
缓存污染是指缓存中的数据与真实数据源的数据不一致的现象