架构培训 -05 学习总结 缓存、消息和负载均衡
1.缓存
1.1概念
存储在计算机上的一个原始数据复制集,以便于访问(维基百科)
作用:用于加快读取速度。缓存是介于数据访问者和数据源之间的一种高速存储。
缓存(cache)和缓冲(buffer)的区别?
缓存是为了弥补高速设备和低速设备之间的鸿沟而引入的中间层,最终起到快速访问的目的。
缓冲主要是做流量整形,把突发的小数量较小规模的I/O整理成平稳的小数量较大规模的I/O,以减少响应次数。
缓冲存在哪些地方?
CPU缓存
操作系统缓存
数据库缓存
JVM编译缓存
CDN缓存
代理与反向代理缓存
前段缓存
应用程序缓存
分布式对象缓存
1.2缓存关键指标
有没有必要使用缓存的关键评判指标:缓存命中率
缓存命中率的主要指标:
缓存集合大小
一定要想办法减少可能的缓存键数量。键数量越少,缓存命中率越高。
缓存可使用内存空间
物理上能缓存的对象越多,缓存命中率就越高。
缓存对象生存时间
称为TTL(Time To Live)。对象缓存的时间越长,缓存对象被重用的可能性就越高。从现实项目来看,尽量都要对缓存对象设置生存时间。
1.3缓存类型
通读缓存
给客户端返回缓存资源,并在请求未命中缓存时获取实际数据返回给客户端并将数据缓存起来供下次使用。
常见通读缓存有:代理缓存、反向代理缓存、和CDN缓存等等。
旁路缓存
应用代码通常会询问对象缓存需要的对象是否存在,如果存在,它会获取并使用缓存的对象,如果不存在或已过期,应用会连接数据源组装对象,并将对象保存到缓存中去。
对象缓存是一种旁路缓存。
1.4缓存常见问题
数据不一致与脏读
使用缓存时会存在缓存数据与实际的业务数据在某些时间点上不一致的情况。对于这个问题,需要根据业务的实际使用场景进行处理,如果允许一段时间内出现不一致的情况,那就可以通过缓存数据过期时间来处理。如果需要时刻保持一致,当数据更新的时候同时保证删除缓存中的旧数据。
缓存雪崩
当缓存服务宕机或者大量缓存数据失效,导致大量请求到数据库中去获取,当数据库无法承受这个压力时,导致数据会宕机,从而影响到整个应用程序不可用,造成雪崩效应。
处理这个问题的常用方式:
1.预警--及时将问题暴露出来。
2.限流--防止整个系统不可用的情况出现,保证系统可用,给部分用户提供服务。
缓存参透
在不恰当的业务、或者恶意攻击持续高并发的请求某个不存在的数据,导致去请求数据库,给数据库造成很大的压力,甚至数据库崩溃。
常用的应对策略:将不存在的数据也缓存起来,并设定一个较短的过期时间。
1.5分布式对象缓存的一致性hash算法
缓存在使用过程中主要的两个问题(缓存雪崩、缓存参透),都有可能是缓存服务器宕机和缓存数据大量丢失的情况造成的。因此在缓存服务器上要求缓存服务是高可用的,同时在缓存服务器伸缩时,不能导致大量缓存失效。
解决这个问题常用的做法是使用一致性hash算法。一致性Hash算法将整个哈希值空间组织成一个虚拟的圆环,哈希函数H的值空间为0-2^32-1。
实际项目中常用的是基于虚拟节点的一致性hash算法(具体实现已经在作业中做了https://xie.infoq.cn/article/ad845abee71d0c28a3b505907),如下图:
1.6 常用缓存中间件比较(Redis VS memchached)
集群区别:
memcached集群: memcached 集群通过客户端自己实现路由选择,集群机器节点之间不感知互相的存在。
redis集群:
2.消息队列
通过消息队列能够构建起异步调用框架。
消息队列两种模型:
点对点模型
发布订阅模型
消息队列的好处:
异步处理,提升性能
具有更好的伸缩性
具有削峰填谷作用
失败隔离和自我修复
具有很好的系统解耦作用
常用MQ产品比较:
图里的49M 是指百度搜索出来的文档量。通过这个量来决策选择哪款MQ产品也是一种方式方法。
3.负载均衡
3.1常见的几种负载均衡架构
http重定向负载均衡
这种方式现实环境中很少用,因为性能低(一次请求需要两次HTTP),重定向服务器还有单点问题。
DNS负载均衡
一些大公司具有流量超大和用户分布广的特点,常用DNS负载均衡作为第一层负载来使用。使流量可以通过多个入口进行访问达到分流的目的,同时也可根据用户地理位置选择最近的机房提供服务,减短用户访问的网络路径,最终达到提升用户体验。
如果是直接将DNS负载均衡对接应用服务器,那是不提倡使用,那样需要把应用服务器的都暴露在外网非常不安全。如下图这样是不提倡使用的。
反向代理负载均衡
这种负载均衡架构在中小型企业中非常常见。常用nginx 、apache作为反向代理服务器。
缺点:所有的请求和响应流量都要经过负载均衡器,容易形成堵塞点。
IP负载均衡
同反向代理负载均衡差不多,但要优于反向代理负载均衡。这个是直接通过修改数据包IP的方式实现的,不需要重新服务器端发起一次http请求。 通过LVS可以实现。
数据链路层负载均衡
适合用于大型互联架构。
3.2负载均衡常用的几种算法
这几种负载均衡算法中,轮询和随机算法比较常用。原地址散列在实际场景中可临时用于那些有状态的老项目应对流量突增的情况下。
3.3session管理
在现在的应用中尽量做到无状态,对于一些实际场景中需要用到session(例如购物车),基本上都上通过redis或RDB之类的方式来实现集群中各节点的session共享
评论