《架构师训练营》-第五周-缓存、队列、负载均衡、分布式数据库

这周总共介绍了缓存,消息队列,负载均衡和分布式数据库。

缓存

缓存命中率

影响缓存命中率的指标有:缓存键集合大小,缓存可使用内存空间,缓存对象生存时间。

缓存键集合大小

在保证缓存命中率的同时,尽量减少缓存键的数量。

天气预报,根据IP来缓存和根据国家来缓存。

缓存可使用内存空间

物理上能缓存上的对象越多,缓存的命中率越高

缓存对象生存时间

对象缓存的时间越长,缓存对象被重用的可能性越高

一致性Hash算法

普通hash算法

普通hash算法,将缓存数据的key计算一个值,然后mod服务器节点数量。当时在增加或移除服务器节点时,无法继续将缓存数据平均分配在剩余服务器节点。
《架构师训练营》-第五周-缓存、队列、负载均衡、分布式数据库_第1张图片

虚拟节点

因为hash值有2^32个,将一个服务器节点分成多个虚拟节点,使其尽可能均匀的分配。
《架构师训练营》-第五周-缓存、队列、负载均衡、分布式数据库_第2张图片

各种介质访问延迟

《架构师训练营》-第五周-缓存、队列、负载均衡、分布式数据库_第3张图片

合理使用缓存

以下场景不建议使用缓存:

  • 频繁修改的数据,读写比例低于2:1
  • 没有热点访问的数据

缓存极端场景

缓存雪崩

当缓存系统因为压力过大导致崩溃时,数据库因扛不住压力发生宕机,这种情况称为缓存雪崩。

  • 解决方案:从源头限流之后,再重启数据库和缓存
  • 如何避免:搭建高可用的缓存系统

缓存预热

可以在系统启动的时候,先将一些数据加载到缓存中,这种行为称为缓存预热。

缓存穿透

如果不恰当的业务、或者业务攻击持续高并发的请求某个不存在的数据,因为没有命中缓存,所以直接查询数据库,给数据库造成很大的压力,这种情况称为缓存穿透。

  • 解决方案:将没命中的key也缓存起来,缓存的值为null。(redis可以使用布隆过滤器)

缓存产品比较

// TODO

消息队列

同步

线程阻塞等待被调用的方法返回

异步

线程调用了方法后,直接返回,不需要等待返回。

一般情况下,会有回调机制或者通知机制,告诉调用者,之前调用的方法已经有返回值了。

消息队列

更好的伸缩性

《架构师训练营》-第五周-缓存、队列、负载均衡、分布式数据库_第4张图片

削峰填谷

《架构师训练营》-第五周-缓存、队列、负载均衡、分布式数据库_第5张图片

解耦

生产者和消费者两个角色是互不影响的。所以系统间的耦合度降低。
《架构师训练营》-第五周-缓存、队列、负载均衡、分布式数据库_第6张图片

事件驱动架构EDA

《架构师训练营》-第五周-缓存、队列、负载均衡、分布式数据库_第7张图片

MQ产品比较

//TODO

负载均衡

主流负载均衡理论知识

负载均衡算法

  • 轮询:平均分配到应用服务器上,适用于硬件设备一致的场景下。
  • 加权轮询:根据应用服务器的权重进行分配,让更多的请求被分配到性能更好的应用服务器。
  • 随机:好的随机算法本身就比较均衡,还可以实现加权随机
  • 最少连接:记录应用服务器正在处理的连接数,将新的请求分配到最少连接的服务器上。
  • 源地址散列:将请求的IP进行hash计算,可以实现会话粘滞。

分布式数据库

一主一从 / 一主多从

主节点提供写功能,从节点提供读功能。
《架构师训练营》-第五周-缓存、队列、负载均衡、分布式数据库_第8张图片

主主复制

互为主节点,都提供读写功能
《架构师训练营》-第五周-缓存、队列、负载均衡、分布式数据库_第9张图片

主主复制注意事项

  1. 不能并发写入
  2. 复制只是增加读的能力,没有增加写的能力
  3. 更新表结构会导致巨大的同步延迟(可以手动更新)

分布式数据库中间件

  • MyCat(支持读写分离,分库分表)
  • altas
  • Amoeba for MySQL
  • MySQL-Proxy
  • MySQL-Cluster

你可能感兴趣的:(#,架构师训练营)