Dubbo 3 之 Triple 流控反压原理解析

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: Triple 是 Dubbo3 提出的基于 HTTP2 的开放协议,旨在解决 Dubbo2 私有协议带来的互通性问题。Triple 基于 HTTP2 定制自己的流控,支持通过特定的异常通知客户端业务层服务端负载高情况,保护了服务端被大流量击垮,提高系统高可用能力。

Triple 是 Dubbo3 提出的基于 HTTP2 的开放协议,旨在解决 Dubbo2 私有协议带来的互通性问题。Triple 基于 HTTP2 定制自己的流控,支持通过特定的异常通知客户端业务层服务端负载高情况,保护了服务端被大流量击垮,提高系统高可用能力。


流控反压现状


客户端和服务器端在接收数据的时候有一个缓冲区来临时存储数据,但是缓冲区的大小是有限制的,所以有可能会出现缓冲区溢出的情况, Http通过流控保护数据溢出丢失风险。


Http1流控


在HTTP1.1中,流量的控制依赖的是底层TCP协议,在客户端和服务器端建立连接的时候,会使用系统默认的设置来建立缓冲区。在数据进行通信的时候,会告诉对方它的接收窗口的大小,这个接收窗口就是缓冲区中剩余的可用空间。如果接收窗口大小为零,则说明接收方缓冲区已满,则发送方将不再发送数据,直到客户端清除其内部缓冲区,然后请求恢复数据传输。


Http2流控


Http2使用了多路复用机制,一个TCP连接可以有多个Http2连接,故在Http2中,有更加精细的流控制机制,允许服务端实现自己数据流和连接级的流控制。服务端与客户端初次见了连接时,会通过发送Http2SettingsFrame设置初始化的流控窗口大小,用于Stream 级别流控,默认为65,535字节。定好流控窗口后,每次客户端发送数据就会减少流控窗口的大小,服务端收到数据后会发送窗口更新包(WINDOW_UPDATE frame)通知客户端更新窗口。客户端收到窗口更新包后就会增加对应值的流控窗口,从而达到动态控制的目的。


image.png


Triple流控反压


Netty基于Http2实现了基础的流控,当服务端负载过高,客户端发送窗口为0时,新增请求就无法被发送出去,会在缓存到客户端待发送请求队列中,缓存数据过大,就会造成客户端内存溢出,影响业务程序。

Triple基于netty实现了Http2协议,通过Http2FlowController接口统一封装,在实现分为进站(inbound)和出站(outbound)两个维度的实现。Triple在inbound流量上使用了netty的默认流控实现,在outbound上实现了自己流控,基于服务端负载,将服务端流量压力透传到客户端业务层,实现客户端的业务反压,暂停业务继续发送请求,保护服务端不被大流量击垮。


连接初始化


Triple在初次建立连接时,通过TripleHttp2Protocol初始化http2配置,默认流控窗口DEFAULT_WINDOW_INIT_SIZE = MIB_8,并在服务端和客户端加入自己的outbound流控接口。


image.png


Inbound流控


Inbound流量会通过DefaultHttp2LocalFlowController的consumeBytes

方法实现流控窗口更新与发送。


1、入口传人Http流与更新数据大小


image.png


2、找到对应连接实现数据消费


image.png


3、更新流控窗口


image.png

image.png


4、发送流控更新数据包(window_update)

image.png



Outbound流控


Outbound通过Triple自己的流控实现TriHttp2RemoteFlowController,将服务端压力反馈到业务层,保护服务端被大流量击垮。


1、发送数据时判断是否还有窗口


image.png


2、窗口为0时抛出特定异常


image.png


3、反馈客户端流控异常

image.png


4、总结


Triple通过将底层客户端发送窗口为0场景封装为特定流控异常,透传至客户端上层业务,阻止客户端业务继续数据发送,有效的保护了服务端被大流量击垮和客户端的内存溢出的问题。


未来展望


目前Triple已经基本实现了流控反压能力,未来我们将深度联动业务,基于业务负载自适应调整反压流控,一是在inbound上将流控窗口包发送时机调整到服务端业务处理完成后,二是在outbound流量上关联客户端业务层,动态调整客户端发送速率。从而实现基于服务端业务负载动态反压流控机制。


相关文章
|
5月前
|
监控 Dubbo 应用服务中间件
启动Dubbo项目注册Zookeeper时提示zookeeper not connected异常原理解析
启动Dubbo项目注册Zookeeper时提示zookeeper not connected异常原理解析
241 0
|
8月前
|
JSON Dubbo JavaScript
Dubbo3 Triple 协议重磅升级:支持通过 HTTP 连通Web与后端微服务
阿里 [HSF2 框架已经完成到 Dubbo3 的全面升级](https://ata.atatech.org/articles/11000209827?spm=ata.25287382.0.0.26577536vUxJq6),阅读本文了解 Triple 协议工作原理。更多技术内容分享,请参见[官网博客](https://cn.dubbo.apache.org/zh-cn/blog/) ## 全新
304 0
Dubbo3 Triple 协议重磅升级:支持通过 HTTP 连通Web与后端微服务
|
9月前
|
JSON Dubbo JavaScript
Dubbo Triple 协议重磅升级:支持通过 HTTP 连通 Web 与后端微服务
Dubbo Triple 协议重磅升级:支持通过 HTTP 连通 Web 与后端微服务
|
11月前
|
自然语言处理 Kubernetes Dubbo
带你读《Apache Dubbo微服务开发从入门到精通》——二、 HTTP/2(Triple)协议(1)
带你读《Apache Dubbo微服务开发从入门到精通》——二、 HTTP/2(Triple)协议(1)
145 0
|
11月前
|
自然语言处理 Kubernetes Dubbo
带你读《Apache Dubbo微服务开发从入门到精通》——二、 HTTP/2(Triple)协议(2)
带你读《Apache Dubbo微服务开发从入门到精通》——二、 HTTP/2(Triple)协议(2)
132 0
|
11月前
|
自然语言处理 运维 Dubbo
带你读《Apache Dubbo微服务开发从入门到精通》——二、 HTTP/2(Triple)协议(3)
带你读《Apache Dubbo微服务开发从入门到精通》——二、 HTTP/2(Triple)协议(3)
95 1
|
11月前
|
Dubbo Java 应用服务中间件
带你读《Apache Dubbo微服务开发从入门到精通》——二、 HTTP/2(Triple)协议(4)
带你读《Apache Dubbo微服务开发从入门到精通》——二、 HTTP/2(Triple)协议(4)
93 1
|
11月前
|
Dubbo Java 应用服务中间件
带你读《Apache Dubbo微服务开发从入门到精通》——二、 HTTP/2(Triple)协议(5)
带你读《Apache Dubbo微服务开发从入门到精通》——二、 HTTP/2(Triple)协议(5)
95 0
|
11月前
|
Dubbo Java 应用服务中间件
带你读《Apache Dubbo微服务开发从入门到精通》——二、 HTTP/2(Triple)协议(6)
带你读《Apache Dubbo微服务开发从入门到精通》——二、 HTTP/2(Triple)协议(6)
98 1
|
11月前
|
Dubbo Java 应用服务中间件
带你读《Apache Dubbo微服务开发从入门到精通》——二、 HTTP/2(Triple)协议(7)
带你读《Apache Dubbo微服务开发从入门到精通》——二、 HTTP/2(Triple)协议(7)
78 0