架构师训练营第 1 期 - 第五周总结

用户头像
Todd-Lee
关注
发布于: 2020 年 10 月 25 日



缓存

本周一开始主要是从"缓存"这个维度来扩展看,在整个架构设计中,什么时候需要缓存,以及从哪些方面入手把缓存这种方式应用到我们的架构中.



为什么我们需要缓存?

缓存可以大幅度的提升我们系统的访问速度,并且降低数据库的访问压力.

衡量一个缓存好或者不好就是看缓存的命中率.



我们在架构中可以设置的缓存有:



代理缓存,

也可以叫正向代理缓存,存在于我们正向访问服务器路径上的缓存服务器,可以缓存我们访问的内容.

反向代理缓存

存在于反向代理服务器中,可以不发送往应用服务器,直接返回给客户端.也可以存在多层的反向代理服务器,分别对前端服务器和后端服务器分别代理并返回.

CDN

可以同时代理静态资源和动态资源,距离用户相对于Web应用服务器更近.



上述三中都是 通读缓存(read-through), 对请求方透明,无需关注.

还有一种,旁路缓存(cache-aside), 可以设置在用户侧, 先访问旁路, 不命中后再发送给服务器.像是浏览器中的 localStorage ,或者应用程序设置在本地的文件, 都属于这类缓存.



为了应付更大流量和更大存储量的缓存,需要对缓存服务器做分布式集群处理,用以提高可扩展性.

这个时候就需要针对多台服务器做分布式的一致性算法.常用的有

基于虚拟节点的一致性 Hash 算法



针对于:

频繁修改的数据,不是热点的数据,并不需要采取缓存.

关于热点数据的识别,可以使用LRU算法.



其他需要注意的点有:

  1. 缓存雪崩:缓存突然全部不生效的时候,数据库服务器也会因为压力过大宕机,进而导致整个应用无法使用.这种情况不能使用简单的重启来挽救.

  2. 缓存预热:缓存中存放的是热点数据,热点数据又是缓存系统利用 LRU(最近最久未用)算法对不断访问的数据筛选淘汰出来的,这个过程需要花费较长的时间,在这段时间,系统的性能和数据库负载都不太好,那么最好在缓存系统启动的时候就把热点数据加载好,这个缓存预加载手段叫做缓存预热(warm up)。对于一些元数据如城市地名列表、类目信息,可以启动时加载数据库中全部数据到缓存进行预热。

  3. 缓存穿透:如果不恰当的业务、或者恶意攻击持续高并发的请求某个不存在的数据,因为缓存没有保存该数据,所有的请求都会落到数据库上,会对数据库造成很大的压力,甚至崩溃。一个简单的对策是将不存在的数据也缓存起来(其 value 值为 null),并设定一个较短的失效时间。



消息队列

因为方法调用的特性,异步调用一方面有更高的效率,不阻塞消息,另一方面异步调用并不会让业务和程序之间耦合.使用消息队列就能将系统解耦,并且提高系统吞吐量.同时也能提高更高的伸缩性和Qos.

而且,在部分系统失效的情况下,这些失效的组件不会大面积影响系统全局,起到隔离的作用.



负载均衡

常用的负载均衡架构有:

HTTP 重定向负载均衡

DNS 负载均衡

反向代理负载均衡

IP 负载均衡

数据链路层负载均衡

HTTP重定向负载均衡因为效率不高一般不采用, DNS负载均衡一般和其他负载均衡结合使用,形成多级负载均衡,DNS更能从地域上去做异地多活.

针对于单机房多台集群,比较多的采用反向代理负载均衡.但是压力会集中在负载均衡服务器上.

IP和数据链路负载均衡是通过修改TCP数据包的方式实现负载均衡.



负载均衡算法有:

轮询,加权轮询,随机,最少连接,源地址散列.

其中只有源地址散列可以维持Session,其他集中都无法维持,需要引入Session管理服务器来统一管理Session.



用户头像

Todd-Lee

关注

还未添加个人签名 2017.10.17 加入

还未添加个人简介

评论

发布
暂无评论
架构师训练营第 1 期 - 第五周总结