Week 5 学习总结
5.1 分布式缓存架构:架构原理与使用中的注意事项
缓存是介于数据访问者与数据源之间的一种调整存储。
缓存(Cache)与缓冲(Buffer)的区别?
- 缓存是为了提高数据的读取速度
- 缓冲是为了匹配不同硬件的处理速度
- 高速硬件把数据全部写到缓冲中,低速硬件慢慢读取;
- 低速硬件把数据慢慢写到缓冲中,调整硬件可以快速读取
缓存的关键指标:缓存命中率
- 命中缓存数 / 访问总数 * 100%
影响缓存命中率的主要指标
- 缓存粒度
- 缓存内存大小
- 缓存有效期
- 缓存业务场景(读多写少)
5.2 分布式缓存架构:常见的缓存实现形式
缓存分类
- 正向代理缓存
- 返回代理缓存
- CDN
- 浏览器缓存
- 程序缓存
- 程序分布式缓存
- 远程分布式缓存
- Memcache、Redis
一致性 Hash 算法
缓存为什么能提高性能?
- 内存读取速度快
- 不需要中间计算过程
合理使用缓存,避免滥用
LRU,Least Recently Used,最近最少使用,即淘汰最长时间没有被使用的数据
缓存问题
- 数据不一致
- 缓存穿透:大量访问缓存和数据库都不存在的数据
- 缓存击穿:大量访问缓存中没有而数据库中有的数据
- 缓存雪崩:缓存数据同时过期
- 缓存预热
5.3 分布式缓存架构:一致性Hash算法
普通 Hash 算法的问题
- 分配不均匀
- 伸缩不灵活
一致性 hash 算法
- 将服务器节点放到一个环(0~2^32-1)上
- 将数据进行 hash 计算,按顺时针方向映射到离其最近的节点上
5.4 消息队列:如何避免系统故障传递?
消息队列模型
- 点对点模型
- 发布订阅模型
消息队列好处
- 异步处理,提高性能
- 良好的伸缩性
- 削峰填谷
- 失败隔离和自我重试
- 解耦合
主要 MQ 产品
- RabbitMQ,性能好、社区活跃,使用 Erlang 开发,非 Erlang 开发者维护和二次开发困难(49 M)
- ActiveMQ,跨平台,Java 开发(27 M)
- RocketMQ,java 开发,由阿里开源,性能好,可靠(35 M)
- Kafka,Scala 开发,海量日志传输(63 M)
5.5 负载均衡架构:如何用十行代码写一个负载均衡服务器?
负载均衡分类
- HTTP 重定向负载均衡服务器,两次 HTTP 请求
- DNS
- 硬件
- 软件(服务端负载均衡、客户端负载均衡)
负载均衡算法
- 轮询
- 加权轮询
- 随机
- 最少连接
- 源地址 hash
session
- session 复制,所有应用服务器同步保存所有 session
- session 绑定,始终访问同一服务器
- Cookie 记录 session id
- session 服务器
评论