架构师训练营 - 学习总结 第 5 周
缓存:
满足就近原则,关键指标是缓存命中率。影响缓存命中率的主要因素有缓存键集合大小,缓存可使用的内存空间,缓存对象的生存时间等。
代理缓存:分为正向代理和反向代理,其中反向代理又可设为多层,例如分发层和应用层。
缓存有两种处理模式:
通读缓存:例如代理缓存,反向代理缓存,CDN缓存等。
旁路缓存:例如浏览器对象缓存,本地对象缓存,远程分布式对象缓存等。
远程分布式对象缓存中,memcached使用客户端的一致性hash算法来选择特定服务器做存储;redis是服务器端采用CRC16计算得到hash值 mod 16384得到的节点索引来选择特定服务器(有一组节点列表)做存储。
注意技术栈各个层次的缓存,是互联网漏斗模型,越靠近客户侧节省的资源越多。
注意缓存的合理使用: 频繁修改的数据、没有热点的访问等不适合使用缓存;注意数据一致性问题,要么让业务接受有一定延迟的最终一致性方案,要么用开销较大的分布式锁保证强一致性。
缓存雪崩的预防:
1)事前:redis集群保证高可用性,双机房部署。
2)事中:redis cluster已经彻底崩溃 => 缓存服务实例启用ehcache本地缓存,对redis访问的资源隔离,对源服务访问的限流以及资源隔离。
3)事后:redis恢复后,用备份数据启动;数据丢失或过旧,则用快速缓存预热启动。缓存服务里,熔断策略,自动可以恢复,half-open,发现redis可以访问了,自动恢复了,自动就继续去访问redis了。
缓存穿透的解决:
如果这个数据不存在的话,往redis和ehcache等缓存中写入一个失效时间较短的空的数据。
消息队列:
作用有异步、解耦和削峰。
主要产品比较:
activemq适合小型项目,吞吐量不高,社区不活跃,不推荐在生产上使用。
rabbitmq主从架构,erlang语言开发,较难定制,单机万级。
rocketmq和kafka都是分布式架构,吞吐量比rabbitmq高,单机十万级。rocketmq的topic从几十到几千,性能只有小幅下降,MQ功能比较完备;
kafa支撑较少的topic数量即可,保证其超高吞吐量,主要支持较简单的MQ功能。
rocketmq和kafka都是java语言开发,相对容易定制。kafka相对适合大数据领域的实时计算和日志收集。
注意引入消息队列如何保证其高可用性,重复消费的幂等性问题,消息的可靠性传输问题,消息的积压问题处理等。
负载均衡:
相对简单,有HTTP重定向负载均衡、DNS负载均衡、反向代理负载均衡、IP负载均衡、数据链路层负载均衡等。
负载均衡算法:轮询、加权轮询、随机、加权随机、最少连接、源地址散列、目的地址散列等。
应用服务器的session管理:目前是基于redis做分布式的集中存储。
分布式数据库:
这里指关系型数据库,主从复制保证读的高并发,便于冷备和高可用。主主复制保证写的高可用,可以做失效转移和故障恢复。
其他: 待续。。。
版权声明: 本文为 InfoQ 作者【铁血杰克】的原创文章。
原文链接:【http://xie.infoq.cn/article/7f91000bd32536cc0c1324ef0】。未经作者许可,禁止转载。
评论