架构师训练营 - 学习总结 第 5 周

用户头像
水边
关注
发布于: 2020 年 07 月 05 日

这周的主要内容:

1、分布式缓存架构

  • 缓存跟缓冲是不同的,

缓存是为了方便后续频繁重复的读取加速;

缓冲是为了优化用户体验批量读入或写入内存,最后按时间间隔或大小批量操作的。



  • 缓存的关键指标:

缓存命中率:就是查询n次缓存,有多少次得到了缓存;

影响命中率的3个因素:

缓存的key:因为缓存键主要是Hash存储,所以缓存键重复概率要低;

进程内存的大小:缓存能使用的内存越大,能容纳的缓存就越多;

缓存的ttl时长:缓存的生存越久,被重用的可能性就越大。

注1:当然,缓存可能跟实际数据有不一致,所以不能无限拉长缓存ttl,要考虑怎么刷新缓存。

注2:实际应用中,应当采集缓存命中率数据,来评估缓存是否有效,并进行改进。



  • 缓存的分类:

代理缓存:一般在客户端网络,比如公司出口网关、甚至比如浏览器缓存也算一种;

反向代理缓存:一般架设在应用服务器前面,为客户端提供响应,比如NGINX、HaProxy等;

CDN内容分发网络:缓存静态文件,而且分布在全国各地;

旁路缓存:让客户端自己先请求缓存,不存在再请求数据服务,客户端复杂了。

分布式对象缓存:在多台缓存服务器存放不同的缓存数据,减轻单台缓存服务器的压力;



  • 一致性Hash:

由于分布式缓存架构,在扩容或单台崩溃时,可能带来缓存大批量失效的风险,从而造成缓存大量穿透,最终雪崩的场景,因此提出了一致性Hash的架构方案。

同时,一致性Hash可能带来服务器压力不均衡,所以通过要通过增加虚拟结点的情况来改善,

验证一致性Hash算法是否均衡,要通过计算标准差的方案来衡量;

Java里一般使用SortMap或TreeMap红黑树来实现一致性Hash;

注1:标准差计算公式:

(每个样本 - 平均值)的平方 / (服务器数 - 1),结果再取平方根

平方根的结果跟平均值越接近,表示算法的质量越好,分布越均衡。

注2:Redis不使用一致性Hash,而是使用了桶的方案进行数据分片,Memcached使用一致性Hash,服务器之间不共享信息,甚至服务器都不知道自己在集群里,架构相对简单一些。



  • 缓存穿透与缓存雪崩:

客户端持续请求某个不存在的缓存Key,导致数据请求落在后端数据库上,就是缓存穿透,

穿透的请求多了,导致数据库压力太大,慢慢失去响应,从而导致缓存雪崩,整体系统崩溃;

缓存穿透的常见避免方案是把不存在的数据也进行缓存,但是要设置较短的缓存时长。

对于热点key,且数据不敏感的,也可以对请求数据库加锁,其它无缓存请求直接返回空。

另外,如果缓存需要扩容,除了尽量在低谷操作,如果担心出现压力,应该提前进行缓存预热,把数据提前载入缓存服务器。



  • 消息队列与异步架构

消息队列一般用途:

1、异步处理,快速响应,提升用户体验,加大服务器吞吐量,但是结果需要异步回调,或轮询的机制,会比同步方案复杂一些;

2、削峰填谷:消息按一定的速率进行消费,这样即使短时间来了大量消息,也不会对消费者造成冲击,这是削峰;在消息生产者压力回落的谷底时,持续消费,这是填谷;

3、业务解耦:把强耦合的2个服务进行解耦,降低服务之间的复杂度,提升可维护性,比如:支付服务在支付完成,只需要发个消息出去,不关心谁来消费消息,其它服务想了解,就去订阅这个消息即可。



  • 负载均衡架构:

降低单台后端服务器压力,提升整个系统的横向扩展能力。

常见的负载均衡,有:

1、应用层代理,比如Nginx、HaProxy在http层代理,提供了强大的转发支持,但是效率低下,因为需要解析比较多的数据包信息;

2、四层代理,在TCP层进行代理,提升了转发的效率;

3、三层代理,在IP层进行代理,进一步提升效率,但是只能在同一网段,比如LVS。



  • 数据库同步方案

主从同步、主主同步

需要注意的是:主主同步一定不能开启双写,会出现比较大的坑。

发布于: 2020 年 07 月 05 日 阅读数: 52
用户头像

水边

关注

还未添加个人签名 2019.04.14 加入

还未添加个人简介

评论

发布
暂无评论
架构师训练营 - 学习总结 第 5 周