架构师训练营第 1 期 - 第五周总结
缓存
本周一开始主要是从"缓存"这个维度来扩展看,在整个架构设计中,什么时候需要缓存,以及从哪些方面入手把缓存这种方式应用到我们的架构中.
为什么我们需要缓存?
缓存可以大幅度的提升我们系统的访问速度,并且降低数据库的访问压力.
衡量一个缓存好或者不好就是看缓存的命中率.
我们在架构中可以设置的缓存有:
代理缓存,
也可以叫正向代理缓存,存在于我们正向访问服务器路径上的缓存服务器,可以缓存我们访问的内容.
反向代理缓存
存在于反向代理服务器中,可以不发送往应用服务器,直接返回给客户端.也可以存在多层的反向代理服务器,分别对前端服务器和后端服务器分别代理并返回.
CDN
可以同时代理静态资源和动态资源,距离用户相对于Web应用服务器更近.
上述三中都是 通读缓存(read-through), 对请求方透明,无需关注.
还有一种,旁路缓存(cache-aside), 可以设置在用户侧, 先访问旁路, 不命中后再发送给服务器.像是浏览器中的 localStorage ,或者应用程序设置在本地的文件, 都属于这类缓存.
为了应付更大流量和更大存储量的缓存,需要对缓存服务器做分布式集群处理,用以提高可扩展性.
这个时候就需要针对多台服务器做分布式的一致性算法.常用的有
基于虚拟节点的一致性 Hash 算法
针对于:
频繁修改的数据,不是热点的数据,并不需要采取缓存.
关于热点数据的识别,可以使用LRU算法.
其他需要注意的点有:
缓存雪崩:缓存突然全部不生效的时候,数据库服务器也会因为压力过大宕机,进而导致整个应用无法使用.这种情况不能使用简单的重启来挽救.
缓存预热:缓存中存放的是热点数据,热点数据又是缓存系统利用 LRU(最近最久未用)算法对不断访问的数据筛选淘汰出来的,这个过程需要花费较长的时间,在这段时间,系统的性能和数据库负载都不太好,那么最好在缓存系统启动的时候就把热点数据加载好,这个缓存预加载手段叫做缓存预热(warm up)。对于一些元数据如城市地名列表、类目信息,可以启动时加载数据库中全部数据到缓存进行预热。
缓存穿透:如果不恰当的业务、或者恶意攻击持续高并发的请求某个不存在的数据,因为缓存没有保存该数据,所有的请求都会落到数据库上,会对数据库造成很大的压力,甚至崩溃。一个简单的对策是将不存在的数据也缓存起来(其 value 值为 null),并设定一个较短的失效时间。
消息队列
因为方法调用的特性,异步调用一方面有更高的效率,不阻塞消息,另一方面异步调用并不会让业务和程序之间耦合.使用消息队列就能将系统解耦,并且提高系统吞吐量.同时也能提高更高的伸缩性和Qos.
而且,在部分系统失效的情况下,这些失效的组件不会大面积影响系统全局,起到隔离的作用.
负载均衡
常用的负载均衡架构有:
HTTP 重定向负载均衡
DNS 负载均衡
反向代理负载均衡
IP 负载均衡
数据链路层负载均衡
HTTP重定向负载均衡因为效率不高一般不采用, DNS负载均衡一般和其他负载均衡结合使用,形成多级负载均衡,DNS更能从地域上去做异地多活.
针对于单机房多台集群,比较多的采用反向代理负载均衡.但是压力会集中在负载均衡服务器上.
IP和数据链路负载均衡是通过修改TCP数据包的方式实现负载均衡.
负载均衡算法有:
轮询,加权轮询,随机,最少连接,源地址散列.
其中只有源地址散列可以维持Session,其他集中都无法维持,需要引入Session管理服务器来统一管理Session.
评论