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

01

流控反压现状

Aliware

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

1

Http1 流控

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

2

Http2 流控

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

02

Triple 流控反压

Aliware

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

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

1

连接初始化

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

2

Inbound 流控

Inbound 流量会通过 DefaultHttp2LocalFlowController 的 consumeBytes 方法实现流控窗口更新与发送。

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

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

3.更新流控窗口

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

3

Outbound 流控

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

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

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

3.反馈客户端流控异常

4

总结

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

03

未来展望

Aliware

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

点击阅读原文查看原文文档

Dubbo 3 之 Triple 流控反压原理解析相关推荐

  1. java网关限流_基于网关GateWay实现限流-令牌桶 及原理解析

    一.使用流程 1) 引入坐标 org.springframework.boot spring-boot-starter-data-redis-reactive 2.1.3.RELEASE 2) 创建b ...

  2. sojson本地反调试原理解析

    打开sojson的网址:https://www.sojson.com/jsobfuscator.html sojson的js加密位于: 下面我们拿默认代码进行测试: (function(w, d) { ...

  3. 一文搞懂 Flink 网络流控与反压机制

    看完本文,你能get到以下知识 Flink 流处理为什么需要网络流控? Flink V1.5 版之前网络流控介绍 Flink V1.5 版之前的反压策略存在的问题 Credit的反压策略实现原理,Cr ...

  4. Flink 网络流控与反压机制

    Flink 流处理为什么需要网络流控? 分析一个简单的 Flink 流任务,下图是一个简单的Flink流任务执行图:任务首先从 Kafka 中读取数据. map 算子对数据进行转换.keyBy 按照指 ...

  5. 关于流控器件和压控器件

    我们常说bjt是流控器件, MOS管是压控器件,这个其实是从电路设计的角度. 因为你想啊,外界施予的物理量,无论是bjt还是mos管,其实内部都有 PN节 但是这里的"流控"和&q ...

  6. 35-Spark Streaming反压机制、Spark的数据倾斜的解决和Kylin的简单介绍

    19.6 数据的反压机制⭐️ 反压机制的理解 数据流入的速度远高于数据处理的速度,对流处理系统构成巨大的负载压力,如果不能正确处理,可能导致集群资源耗尽,最终集群崩溃, 因此有效的反压机制(backp ...

  7. Flink从入门到精通100篇(二十二)- Flink应用实战案例:如何实现网络流控与反压机制

    目录 Flink 流处理为什么需要网络流控? Flink V1.5 版之前网络流控介绍 Flink V1.5 版之前的反压策略存在的问题 Credit的反压策略实现原理,Credit是如何解决 Fli ...

  8. Flink 网络流控和反压剖析详解

    传送门:Flink 系统性学习笔记 前言: 本文根据 Apache Flink 系列直播整理而成,由 Apache Flink Contributor.OPPO 大数据平台研发负责人张俊老师分享,社区 ...

  9. 一文弄懂Flink网络流控及反压

    一文弄懂Flink网络流控及反压 1. 为什么需要网络流控? 2. 网络流控的实现:静态限速 3. 网络流控的实现:动态反馈/自动反压 3.1 案例一:Storm 反压实现 3.2 案例二:Spark ...

  10. Flink教程(31)- Flink网络流控及反压

    文章目录 01 引言 02 为什么需要网络流控? 03 网络流控的实现:静态限速 04 网络流控的实现:动态反馈/自动反压 4.1 案例一:Storm 反压实现 4.2 案例二:Spark Strea ...

最新文章

  1. git操作手册_基本的Git手册
  2. SAP S/4 HANA新变化-FI数据模型
  3. JBoss5 启动报错java.lang.IllegalArgumentException: ...
  4. rm命令修改为移动到回收站
  5. 2021年电工(技师)考试报名及电工(技师)模拟考试题
  6. mysql提示表不存在的解决方法error: 1146: Table doesn‘t exist
  7. 线性函数、非线性函数与线性回归的区别
  8. Ubuntu下.py文件的运行
  9. 精选优美英文短文1——Dear Basketball(亲爱的篮球)
  10. 【RNN入门到实战】LSTM从入门到实战——实现空气质量预测
  11. Linux之必备软件安装(搜狗输入法、qq等)
  12. 原生js实现跑马灯效果,鼠标放下可以停止跑动
  13. python制作礼物_opencv+python制作硬核七夕礼物
  14. 会员计费系统c语言_c语言课程设计报告 会员卡计费系统源代码
  15. Oracle:根据身份证号码查询年龄最大的人
  16. 用ardupilot 做无人船项目的总结
  17. Ubuntu16.04安装搜狗输入法,以及解决不能输入中文的办法
  18. 半年工作经验的前端菜鸟分享一些经验心得
  19. 计算机操作课后 陆丽娜第二版,操作系统 第四章课后部分答案
  20. Win10默认的图片查看器打开图片很慢怎么办?推荐WPS图片

热门文章

  1. 女生节的一个分号,引发程序员的疯狂热议
  2. 一年后 php_php 一年后,一月后,一日后,一年前,一月后,一周后
  3. 2.1.1 -1【SV数据类型、过程快、方法、例化连接】
  4. 婚礼创意游戏 让你的婚礼high起来
  5. Java实战之图书管理系统(swing版)(4)——主界面及功能实现
  6. Springboot 1.5.6 升级到 2.1.8
  7. 秋招的小伙伴们不要害怕直接找学长学姐聊岗位!!成功率大大!!
  8. 供给云SAASS平台助力企业品牌构建私域生态
  9. Cit、GitHub和GitLab教程
  10. Debezium日常分享系列之:Oracle数据库系列文章之安装和设置