架构师训练营第 5 周总结:缓存,消息队列,负载均衡,分布式数据库
一 缓存
什么是缓存,缓存有什么作用?
缓存是在数据访问者和数据源之间的一种高速存储。当数据需要多次读取,用于加快读取的速度。
缓存为什么能显著提升性能?
缓存数据通常来自内存,比磁盘上的数据有更快的访问速度
缓存存储数据的最终结果形态,不需要中间计算,减少cpu资源的消耗
缓存降低数据库,磁盘,网络的负载压力,使这些I/O设备获得更好的响应特性
缓存是系统性能优化的大杀器
技术简单
性能提升显著
应用场景多
缓存命中率是衡量缓存的关键指标。
缓存命中率:能多少次重用同一个缓存响应业务请求,这个度量指标被称为缓存命中率。
如果查询一个缓存,10次查询9次能够得到正确结果,那么它的命中率是90%
影响缓存命中率的主要指标
缓存键集合大小
缓存可使用内存空间
缓存对象生存时间(TTL)
缓存数据存储,一般使用hash表的数据结构。
缓存无处不在,常见的缓存种类有
cpu缓存,操作系统缓存,数据库缓存,JVM编译缓存,CDN缓存,代理与反向代理缓存
应用程序缓存,分布式对象缓存
通读缓存(read-through)
代理缓存,反向代理缓存,CDN缓存都是通读缓存
通读缓存给客户端返回缓存资源,并在请求未命中缓存时获取实际数据
客户端连接的是通读缓存而不是生成响应的原始服务器
旁路缓存(cache-aside)
对象缓存时一种旁路缓存,旁路缓存通常时一个独立键值对存储
如果缓存中需要的对象不存在,应用会连接主数据源来组装对象,并将其保存回对象缓存中以便将来使用
一致性hash算法在缓存集群中的运用,保证缓存集群在添加或删除机器时,仍然能够快速准确的找到缓存所在的机器。
不适合使用缓存存储的数据:
频繁修改的数据
没有热点访问的数据
更新缓存的三种策略:
设置失效时间,超过失效时间的就从数据库重新加载
通知缓存失效,删除缓存数据,下次查询数据库时,再重新写入缓存
数据更新时立刻更新缓存,会带来更多的系统开销和事务一致性问题,不推荐使用
使用缓存需要注意的问题:
缓存雪崩:数据库已经习惯有缓存的日子,当缓存服务器崩溃时,数据库会因为完全不能承受如此大的压力而宕机。
缓存预热:对热点数据进行缓存的预加载。
缓存穿透:如果因为不恰当的业务或者恶意攻击持续的请求某个不存在的请求,因为缓存没有保存该数据,所有的请求都会落到数据库上,会对数据库造成很大的压力。一个简单的对策就是将不存在的数据也缓存起来(设定值为null),并根据情况设置较短或较长的失效时间。
二 消息队列
消息队列针对的是写的场景。将可以异步处理的消息先写入消息队列中,然后再从消息队列中拿出进行处理。
消息队列的组成:消息的生产者,消息队列,消息消费者。
消息队列的好处
实现异步处理,提升处理性能
更好的伸缩性
削峰填谷
失败隔离和自我修复:因为发布者不直接依赖消费者,所以消息系统可以将消费者系统错误与生产者系统组件隔离。生产者和消费者互相不受对方失败影响。
解耦
消息队列的两种模型:点对点模型和发布订阅模型。
使用事件驱动架构EDA,可以把没有必要同步返回的操作变为异步执行,异步返回,优化程序性能,提升用户体验。
主要的MQ产品开发语言: RabbitMQ Erlang 开发。ActiveMQ和RockerMQ Java开发。Kafka Scala 开发。
三 负载均衡
负载均衡的分类:
HTTP重定向负载均衡
DNS负载均衡
反向代理负载均衡
IP负载均衡
数据链路层负载均衡
负载均衡的算法:
轮询
加权轮询
随机
最少连接:记录每个应用服务器正在处理的连接数(请求数),将新到的请求分发到最少连接的服务器上。这是最符合负载均衡定义的算法。
源地址散列:根据请求来源的IP地址进行Hash计算,得到应用服务器。这个算法可用保证同一个来源的请求总在同一个服务器上处理,实现会话粘滞。
应用服务器集群Session管理的方法:
Session复制
Session绑定
利用Cookie记录Session
Session服务器
四 分布式数据库
mysql复制方案
主从复制
一主多从复制
主主复制
一主多从复制方案的优点:
分摊负载
专机专用
便于冷备
高可用
mysql复制的注意事项:
主主复制的两个数据库不能并发写入
复制只是增加了数据的读并发处理能力,没有增加写并发能力和存储能力
更新表结构会导致巨大的同步延迟。所以需要更新表结构时,一般都是在主数据库和从数据库上分别手动操作。
评论