第五周 技术选型(一) 学习总结
1. 缓存(Cache)
存储在计算机上的一个原始数据复制集,以便于访问,是介于访问者和数据源之间的高速存储,可提高数据读取速度。
2. 缓存(Cache)与缓冲(Buffer)的区别?
缓存是为了提高多次读取速度,缓冲是在高速于低速设备中的中间装置,为了缓冲好数据后以适应当前设备的读写速度进行处理。
3. 各种数据访问延迟情况

4. 缓存数据存储(Hash 表)
Key/value 数据结构,时间复杂度 o{1},可快速查找数据
5. 缓存的关键指标
缓存命中率,缓存是否能多次重用,命中率越高,重用次数越多越能节省数据源资源。
影响缓存命中率的因素,缓存键集合大小、缓存可使用内存空间、缓存对象生存时间。缓存键越少缓存的查询效率越高,应当尽量减少使用键的数量;物理上能缓存的对象越多,缓存命中率就越高;对象缓存的时间越长,缓存被重用的可能性就越高(这里应该注意重用次数不高的对象,长时间存在将影响储存空间)。
6. 缓存的常见形式
代理缓存,一般是在客户端对资源进行了网络缓存,这样不用向服务端请求,来节省客户端网络资源,服务端不需要考虑代理缓存。
反向代理缓存,服务端代理缓存 web 服务的资源,当请求访问时反向代理缓存有资源缓存就直接返回,没有再请求 web 服务。
多层反向代理缓存,各个层级的服务都可以通过反向代理缓存来节省服务资源。
内容分发网络(CDN),由运营商提供,一般在用户就近的地方提供缓存服务。
通读缓存(read-through),通读缓存有数据时直接返回,没有时访问服务。
旁路缓存(cache-aside),是客户端中的缓存,当旁路缓存有数据时直接使用,没数据再请求服务端。
浏览器对象缓存,存 localStorage.set(‘key’,jsonObject);取 localStorage.getItem(‘key’);
本地对对象缓存,本地服务器应用程序将对象存储在内存中,可供其它进程使用。
本地对象缓存构建分布式集群,多服务器本地对象缓存,缓存数据同步,实现内容一致。
远程分布式对象缓存,建立独立的分布式缓存服务器集群,统一对外提供缓存服务。
Memcached 分布式对象缓存,缓存存储的数据是不同的,通过客户端特定的算法找到数据存储的 ip 找到数据,有效利用内存资源,可进行伸缩扩展。
7. 一致性 hash 算法
一致性哈希算法在 1997 年由麻省理工学院提出,是一种特殊的哈希算法,目的是解决分布式缓存的问题。[1] 在移除或者添加一个服务器时,能够尽可能小地改变已存在的服务请求与处理请求服务器之间的映射关系。一致性哈希解决了简单哈希算法在分布式哈希表( Distributed Hash Table,DHT)中存在的动态伸缩等问题。
各级缓存节省资源的情况

缓存是性能优化的大杀器,应用中都应该合理使用缓存。
使用缓存的注意事项:
频繁修改的数据不适合做缓存。
没有热点的访问,对访问热点数据进行缓存,LRU 算法实现优化,对热点访问数据持续缓存,不被访问的数据不进行缓存。
数据不一致与脏读,一般对缓存的数据设置失效时间,允许一段时间的数据不一致的情况可以使用缓存。
缓存雪崩,应当避免缓存数据丢失有大量不命中,造成后方压力,影响服务。
缓存预热,提前准备好必要数据放置在缓存中。
缓存穿透,避免恶意攻击,访问至服务,对不存在的数据也缓存一个值,避免穿透。
8. 消息队列
使用消息队列优化写性能
同步与异步的区别,

同步调用会阻塞等待执行会耗时久一些,
异步调用使用消息队列分步骤实现整个调用过程,
有一个问题要解决的是,客户端请求后不知道处理结果,解决这个问题,可以在处理完后给一个 callback 返回值。

消息队列点对点模型
一个消息生产者生产的消息只被一个消费者消费一次。
消息队列订阅模型
一个消息生产者生产的消息被订阅这个消息的所有消费者都消费。
u 使用消息队列的好处
实现异步处理,提升处理性能。节省了响应等待时间。

具有处理好的伸缩性
在消息量增加时,只需要增加后端处理服务器就可以了,不需要改动服务结构。

消峰填谷
有时短暂的时间会产生大量的并发请求,如果使用消息队列,可以按能力去顺序处理消息请求,不会因为瞬时的服务压力,导致服务崩溃。

失败隔离和自我修复
客户端与服务端的处理不是强依赖,不会相互影响。

解耦
耦合较低

u 事件驱动架构 EDA

以下内容来自《百度百科》
事件驱动架构(Event Driven Architecture,EDA)一个事件驱动框架(EDA)定义了一个设计和实现一个应用系统的方法学,在这个系统里事件可传输于松散耦合的组件和服务之间。一个事件驱动系统典型地由事件消费者和事件产生者组成。事件消费者向事件管理器订阅事件,事件产生者向事件管理器发布事件。当事件管理器从事件产生者那接收到一个事件时,事件管理把这个事件转送给相应的事件消费者。如果这个事件消费者是不可用的,事件管理者将保留这个事件,一段间隔之后再次转送该事件消费者。这种事件传送方法在基于消息的系统里就是:储存(store)和转送(forward)。
特点
构建一个包含事件驱动构架的应用程序和系统,会使这些应用程序和系统响应更灵敏,因为事件驱动的系统更适合应用在不可预知的和异步的环境里。
事件驱动架构在具体实现中是指由一系列相关组件构成的应用,而组件之间通过事件机制完成一定的业务功能。由于在一个 EDA 系统中各个组件都只专注于处理输入的消息与发布输出的消息,因而 EDA 系统能够更有加效地对管道化(pipelined)的、由多软件模块链接而成的并发事件流(concurrent processing of events)进行处理。
EDA 系统中各组件以异步方式响应事件,在本质上是可以并行的,因而在政府部门的电子政务应用中具有极大的优势。其具备以下特点:
◆并发执行
◆事件触发/数据触发/时间规则触发
◆实时/增量响应
◆分布式事件系统处理
优势
事件驱动设计和开发所提供的优势如下所示:
◆ EDA 提高了对不断变化的业务需求的响应,最大限度地减少了对现有业务应用的影响,也常消除了对新打包应用的需要。如果采用特有的粗颗粒服务模型可以基于业务目标快速确定可控的业务变更,并直接、迅速、有效地实施变更以达到业务敏捷性和完整性。
◆可以更容易开发和维护大规模分布式应用程序和不可预知的服务或异步服务;
◆可以很容易,低成本地集成、再集成、再配置新的和已存在的应用程序和服务。
◆促进远程组件和服务的再使用,拥有一个更灵敏、没有 Bug 的开发环境。
从时间维度来看 EDA 的优势:
◆短期利益:更容易定制,因为设计对动态处理有更好的响应;
◆长期利益:系统和组织的状态变得更精准,对实时变化的响应接近于同步。
mq 比较

9. 负载均衡架构
负载均衡架构的几种方式:
HTTP 重定向负载均衡
每次请求都要进行重定向。
缺点:效果比较低,安全性不好。

DNS 负载均衡
在域名解析时,给出不同的服务器 Ip,由域名服务商提供服务。
缺点:直接暴露了服务的 Ip,请求前需要做一次 dns 解析得到要请求的 Ip。

反向代理负载均衡
小规模集群的时候,使用的比较多。
缺点:需要构成完整的 http 协议包,才可以转发,效率不高。

Ip 负载均衡
把请求的每个 tcp 包转发到服务器(改成源地址是负载地址,目标地址是客户端请求的地址转发出去),相比 http 轻量一些。
缺点:响应数据内容太多,可能处理不过来。

数据链路层负载均衡
链路层记录了设备的 mac 地址,通过修改 mac 地址指定响应的服务器。
也称为基于三角模式的负载均衡,是目前大型互联网应用中,最主要的负载均衡实现方式。

负载均衡算法:

负载均衡后的 session 管理,有哪些方式:
Session 复制
每个应用服务器上都复制记录相同的 session。
缺点:session 复制消耗资源较大,不便于伸缩扩展。

Session 绑定
客户端请求指定的应用服务器。
缺点不具备高可用,当应用宕机后,session 会话丢失。

利用 cookie 记录 session
会话信息记录在 cookie,每次请求都可以请求不同的应用服务器,服务端从 cookie 中取出信息。
缺点:cookie 大小有限,cookie 可能被客户端禁止。

Session 服务器
统一由 session 服务器管理 session。应用服务器就成为了无状态的应用服务器,容易实现集群的伸缩。Share nothing 的架构方式,是分布式架构里面最高效、最容易管理、最容易实现、集群伸缩、运维各方面都是最好的一种设计方式。

评论