架构师训练营 Week 05 总结

发布于: 2020 年 07 月 08 日

0 概述

文章框架:

1 分布式缓存架构,介绍了缓存的类型和部署位置,分布式缓存的框架原理

2 异步调用架构,介绍使用消息队列构建的异步框架

3 负载均衡架构,比较多种负载均衡的实现方式

1 分布式缓存架构

缓存是提高读取性能的关键:

  • 一方面是减少I/O的使用

  • 二来减少数据组合所耗费的资源和时间

1.1 缓存的技术要点

1.1.1 Hash表

缓存数据存储,是依靠Hash表来确定其在有限的空间中所在的存储位置。同时分布式缓存的路由选择算法的实现方法。

1.1.2 命中率

缓存的命中率,是评价缓存的关键指标,即是否有效依赖于能多少次重用同一个缓存来响应业务请求。如果查询一个缓存,十次查询九次能够得到正确结果,那么它的命中率是90%。

影响缓存命中率的主要指标有:

  • 缓存键集合大小。键数量越少,缓存的效率越高。

  • 缓存可使用内存空间。缓存的对象越多,缓存命中率就越搞。

  • 缓存对象生存时间,TTL。对象缓存的时间越长,缓存对象被重用的可能性就越高。

1.1.3 实现模式

通读缓存(read-through)是通过在客户端与服务器之间架设缓存服务器。

旁路缓存(cache-aside)的访问路线是,先查询旁路缓存,未命中,再访问服务器,然后把数据写到旁路缓存。例如,本地缓存。

1.2 缓存的类型

1.2.1 代理缓存

  • 代理缓存,是指客户端通过设置本地代理服务器,加快访问速度的技术。

  • 反向代理缓存,是在应用服务器前设置的服务器,用于拦截所有流量,提供缓存服务。

1.2.2 内容分发网络(CDN)

根据URL来区分要访问的服务器:

CDN同时配置静态文件和动态内容:

1.3 分布式集群缓存

1.3.1 本地对象缓存构建分布式集群

缺点是增加了同步的负担,限制于十多台服务器的集群中使用。

1.3.2 远程分布式对象缓存

1.3.2.1 分布式对象缓存的一致性hash算法

一致性hash算法,是为了在增加、减少服务器时,尽可能减少对命中率的影响。Memcached分布式对象缓存,它的路由选择就是通过一致性hash实现(Redis则采用了不同的策略)。一致性hash在增加虚拟节点时是会有节点被覆盖的请款,但也无妨。常的虚拟节点数是150到200。

1.4 合理使用缓存

不是适合使用缓存的:

  • 频繁修改的数据。缓存读写比2:1以上,实践中通常时4:1,缓存才有意义。

  • 没有热点的访问。可以通过最近最久未被使用的规则把冷门数据剔除。

注意事项

  • 缓存血本,缓存突然失效。缓存平时给数据库拦截80%左右的访问量,缓存崩溃了数据库会受不住的,这样会引发一连串的系统奔溃

  • 缓存预热,在刚启动的缓存服务,它需要较长的时间去不断使用LRU(最近最久未用)算法筛选数据。

  • 缓存穿透,在业务不恰当、或者恶意攻击持续高并发地请求某个不存在的数据,因为缓存没有保存该数据,所有的请求都会落在数据库上,可能会造成数据库过压而奔溃。

2 异步调用架构

为了不阻塞客户端、应用服务器的线程,提高系统资源利用率

2.1 消息队列构建异步调用架构

2.1.1 消息队列的类型

2.1.1.1 点对点模型
2.1.1.2 发布订阅模型

2.1.2 消息队列的好处

  • 实现异步处理,提升处理性能

  • 更好的伸缩性

  • 削峰填谷

  • 失败隔离:因为发布者不直接依赖消费者,所以消息系统可以将消费者系统错误与生产者系统组件隔离。同时我们可以增减服务器,而不影响生产者的可用性,这样简化了部署和服务器的管理难度。

  • 解耦合

2.2 EDA事件驱动架构

2.2.1 实现方法

2.2.2 主要MQ产品

  • RabbitMQ,主要特点是性能好,社区活跃。使用Erlang开发,对不熟该语言的,可能不便于维护。(搜索出49M条结果)

  • ActiveMQ,可跨平台,使用Java开发。(27M)

  • RocketMQ,阿里巴巴开源产品,性能比较好,可靠性比较高,Java开发。(35M)

  • Kafka,LinkedIn出品,Scala开发,有专门针对分布式场景优化,因此伸缩性比较好。(63M)

3 负载均衡架构

3.1 负载均衡的实现方法

3.1.1 HTTP重定向均衡负载

利用HTTP重定向特性,使每次HTTP请求都会被重定向到应用服务器。

缺点:

  • 速度慢,HTTP是协议层的,数据包大,重定向后,共两次请求会增加网络负载

  • 不安全,把应用服务器的IP直接暴露给用户,容易被攻击

3.1.2 DNS均衡负载

通过对DNS服务器,给同一个域名,配置多个应用服务器的IP,并根据制定的规则轮询、或者随机返回IP地址,以达到负载均衡的目的

3.1.3 反向代理均衡负载

既把反向代理作为缓存服务器,亦可以让它兼任负载均衡。但这样就增加了缓存服务器的负载,得不偿失。

3.1.4 IP均衡负载

当均衡服务器收到用户请求,它会把TCP包的源IP地址、目标IP地址分别改为:负载均衡服务器自己的IP、应用服务器的IP;当应用服务器返回时,再把IP地址改回去。

缺点是,慢,因为需要对TCP包进行拆装

3.1.5 数据链路层负载均衡

在负载均衡服务器收到数据包时,把目标网卡的MAC地址改为应用服务器的网卡MAC地址;同时把应用服务器设置为和均衡服务器一样的IP,网络层就可以正常解包。称为,三角传输模型。

3.2 负载均衡算法

  • 轮询

  • 加权轮询

  • 随机

  • 最少连接

  • 源地址散列

3.3 应用服务器集群的Session管理

  • Session复制,增加应用服务器的负担,得不偿失

  • Session绑定,客户端每次请求都会被分配到指定的服务器上,但这样就降低了系统的可用性

  • 利用Cookie记录Session,接收到请求后,从Cookie解析得到Session对象,增加网路负载,性能差

  • Session服务器,理性模型

用户头像

Wancho

关注

还未添加个人签名 2020.02.28 加入

还未添加个人简介

评论

发布
暂无评论
架构师训练营 Week 05 总结