《云计算与虚拟化技术丛书 Service Mesh实战》—2.2Linkerd架构
2.2 Linkerd架构
Linkerd是基于Twitter公司开源的高性能RPC系统Finagle构建而成,Finagle为多种协议实现统一的客户端和服务端API接口,主要目的就是降低开发人员解决动态服务发现、服务负载均衡、错误处理等的复杂性,使开发人员集中关注业务逻辑,而不用太多关注服务发现、服务负载均衡、错误处理等分布式系统需要解决的问题。作为Linkerd的实现基石,Linkerd几乎继承Finagle的设计框架和所有功能,因此通过学习Finagle的框架就能顺理成章地理解Linkerd的框架。根据Finagle官方文档(https://twitter.github.io/finagle/guide/index.html),Finagle主要由服务器端和客户端模块构成,两者各司其职,具体如图2-1所示。
图2-1 Linkerd架构
图2-1左边是服务器端模块,右边是客户端模块,它们之间相互协调工作。
1.服务器端模块
如图2-1所示,服务器端模块非常简单,其设计主旨就是能快速处理高并发请求,主要包括的功能模块:观测性模块、并发限制模块、请求最后期限模块、请求超时模块及会话终止模块。
Observe模块:用于帮助开发和运维人员追踪、监控系统运行时状态及指标,方便进行问题排查。
并发限制模块:控制服务器最大处理请求数量,当发送到服务器的请求数量超过预先设定的最大并发处理数量和队列可保存的最大请求数量之和时拒绝处理任何新的请求,默认处理无限数量请求,但可根据具体需求进行调整。
请求最后期限模块:该模块用于在某些情况下显式地拒绝请求,比如服务正在启动中,或者碰巧系统正在进行垃圾回收,选择拒绝请求而不是让服务器处理这些无用请求而使系统陷入超负荷状态是最佳选择,需注意的是该功能在当前版本Linkerd中还未实现。
请求超时模块:如果请求在指定时间内未被服务器处理,则将其标识为处理失败。由于该模块只是将请求标识为失败,所以并不会拒绝任何新收到的请求。默认情况下远端客户端不会重试这种标记为失败的请求,因为它不知道队列中请求是否已经超时或者即将被处理。默认服务器端和客户端都没有超时限制,可根据应用需求进行调整。
会话终止模块:服务器端通过该模块控制会话连接的生命周期,如果会话连接超过设定的最大生命周期时间和可允许最大置于空闲状态的时间,服务器端终止该会话连接以释放其所占资源。
对于这些模块,按照处理请求的先后顺序依次生效,图2-1中的可观测性模块首先生效,其次是并发限制模块,依次进行。
2.客户端模块
相对服务器端模块,客户端模块实现非常复杂,由客户端栈、端点栈和连接栈构成,其设计主旨是最大化请求成功率及最小化延迟,流经客户端的请求经过上述三个栈,每个栈提供特定功能以确保最大化请求成功率及最小延迟目标得以实现。
(1)客户端栈
客户端栈是请求第一站,其负责解析请求名字和分发请求到后端应用实例,由观测模块、重试模块、超时和会话终止模块及负载均衡器模块构成。
Observe模块:类似服务器端Observe模块,主要用于帮助开发和运维人员追踪、监控系统运行时状态及指标,方便进行问题排查。
重试模块:其位于负载均衡器及其他模块上,可重试来自于下层模(如超时模块、负载均衡、熔断)标记为失败的请求,只有当Finagle确认足够安全时才重试,以此提高请求成功率。
超时模块:分会话层和请求层超时,会话层超时表示请求在指定的时间内未分配到可用服务或者会话,而请求则会因为服务超时异常被标记为失败。请求层超时表示请求在指定时间内允许处于未被处理状态,一旦超过指定时间,便触发客户端取消请求,对大多数协议,如果请求已经分发,只有通过终止会话连接才能实现取消请求,但HTTP/2和Mux无需终止会话连接便可实现。默认会话层和请求层超时均未指定超时限制。
负载均衡模块:其负责将应用请求动态分发到后端端点(应用实例),负载均衡算法通过有效时延反馈机制尽可能精确地将请求分发到高处理能力、低延时的应用实例,最大努力地保证高成功率。
(2)端点栈
当客户端栈选出最优节点实例(应用实例)时,应用请求流入第二站:端点栈,其提供熔断机制及连接池管理。端点栈仍然有观测模块;其次是熔断模块,该模块主要功能是根据后端实例反馈信息关闭不能处理请求的会话连接,而客户端栈的负载均衡器据此停止分发请求到该会话连接,以此尽可能减少将时间花费在明知会失败的连接上。Finagle提供两种类型的熔断策略,一种基于会话层,另一种基于请求层。基于会话层的熔断策略在连接失败时将对应的应用实例标记为不可用状态,拒绝接收新的请求;基于请求层的熔断策略如果观测到连续指定数量的请求失败,则将后端应用实例标记不可用状态。无论是基于会话层还是请求层,当后端应用实例被标记为不可用状态时,负载均衡器都不会将新的请求分发到该应用实例;除此之外,端点栈还管理连接池,通过维护一定数量的连接以换取更小的服务访问延时。
(3)连接栈
连接栈的主要工作是管理连接生命周期并实现有线协议。
关于Finagle的服务器端和客户端模块所提供的各种功能,在Linkerd中则通过配置路由器(router)实现,后面章节我们将详解介绍如何配置路由器。
- 点赞
- 收藏
- 关注作者
评论(0)