架构师训练营第 5 周学习总结
分布式缓存架构
* Cache v.s Buffer
* Cache: 数据多次读取时,加快读取速度
* Buffer: 在读写数据到低速设备时,提升应用性能
* 缓存数据存储
* 一般使用Hash表存储
* 缓存命中率
* 缓存键集合大小
* 缓存可使用内存空间
* 缓存对象生存时间
* 缓存实现形式
* 通读缓存
* 代理缓存
* 反向代理缓存
* 内容分发网络
* 旁路缓存
* localStorage
* 本地对象缓存
* 进程内
* 同机器
* 分布式
* Memcached
* Share Nothing架构
* 路由算法:对key进行hash code,然后对服务器数目取余
* Redis
* 支持复杂的数据结构
* 支持多路复用和异步IO
* 支持主从复制
* 原生集群和share nothing集群
* 一致性Hash算法
* 原始算法实现
* 构建一致性Hash环,范围0~2^32-1
* 计算节点的Hash值,放到环上
* 计算待存储数据Key的Hash值,顺时针查找临近的节点
* 存在问题
* 负载可能不均衡
* 扩容分摊的负载也不均衡
* 基于虚拟节点的一致性Hash算法
* 缓存提升性能的原因
* 存储在内存,速度快
* 存储数据的最终形态,不需要计算
* 降低数据库和磁盘的负载压力
* 缓存的注意事项
* 频繁修改的数据
* 没有热点的访问
* 数据不一致与脏读
* 缓存雪崩
* 缓存预热
* 缓存穿透
消息队列
* 同步调用 v.s. 异步调用
* 同步调用:同步等待,阻塞,多个调用的等待时间会叠加
* 异步调用:通过消息队列来解耦,不用阻塞等待
* 异步调用架构
* 点对点模型:一个消息只被消费一次
* 发布订阅模型:一次生产,多次消费
* 消息队列的好处
* 提升处理性能
* 更容易伸缩
* 消峰填谷
* 失败隔离
* 自我修复
* 解耦生产者和消费者
* MQ产品
* RabbitMQ - 性能好,社区活跃,Erlang开发
* ActiveMQ - 跨平台,Java开发
* RocketMQ - 性能好,可靠性高,Java开发
* Kafka - 分布式的伸缩性好,Scala开发
负载均衡架构
* 将高并发的用户请求分发给应用服务器集群,分摊负载压力
* 如何分发请求
* HTTP重定向负载均衡
* 性能低:两次网络请求
* 安全性差:暴露后台服务器
* DNS负载均衡
* 不需要自己部署负载均衡服务器
* 不会增加网络请求
* DNS域名解析出来的IP是内部LB服务器地址
* 反向代理负载均衡
* HTTP应用层协议转发
* 性能比较差,适合小规模集群
* IP负载均衡
* IP层协议转发,性能比较好
* 在大规模集群中,CPU/带宽可能会成为瓶颈
* 数据链路层负责均衡
* 使用同样的虚拟IP地址,LB服务器只修改MAC地址然后转发
* 应用服务器直接把响应返回给用户
* 如何选择服务器
* 轮询/加权轮询
* 随机/加权随机
* 最少连接
* 源地址散列 - sticky session
* 会话管理
* Session复制
* 性能差,所有服务器进行通讯存储所有的会话信息
* Session绑定
* 不能保证高可用
* Cookie记录Session
* Cookie大小有上限
* Cookie可能被禁用
* Session服务器
* 将Session保存在共享Session服务器集群
* 应用服务器Share Nothing,无状态
评论