作者:顾欣

Triple 是 Dubbo 3 提出的基于 HTTP2 的开放协议,

旨在解决 Dubbo 2 私有协议带来的互通性问题。

Triple 基于 HTTP/2 定制自己的流控,支持通过特定的异常通知客户端业务层服务端负载高情况,

保护了服务端被大流量击垮,提高系统高可用能力。

一、流控反压现状

客户端和服务器端在接收数据的时候有一个缓冲区来临时存储数据,

但是缓冲区的大小是有限制的,所以有可能会出现缓冲区溢出的情况,

HTTP 通过流控保护数据溢出丢失风险。

1、HTTP/1 流控

在 HTTP/1.1 中,流量的控制依赖的是底层TCP协议,在客户端和服务器端建立连接的时候,

会使用系统默认的设置来建立缓冲区。在数据进行通信的时候,会告诉对方它的接收窗口的大小,

这个接收窗口就是缓冲区中剩余的可用空间。如果接收窗口大小为零,则说明接收方缓冲区已满,

则发送方将不再发送数据,直到客户端清除其内部缓冲区,然后请求恢复数据传输。

2、HTTP/2 流控

HTTP/2 使用了多路复用机制,一个TCP连接可以有多个 HTTP/2 连接,

故在 HTTP/2 中,有更加精细的流控制机制,允许服务端实现自己数据流和连接级的流控制。

服务端与客户端初次见了连接时,会通过发送 HTTP/2 SettingsFrame设置初始化的流控窗口大小,

用于 Stream 级别流控,默认为 65,535 字节。

定好流控窗口后,每次客户端发送数据就会减少流控窗口的大小,

服务端收到数据后会发送窗口更新包(WINDOW_UPDATE frame)通知客户端更新窗口。

客户端收到窗口更新包后就会增加对应值的流控窗口,从而达到动态控制的目的。

二、Triple流控反压

Netty 基于 HTTP/2 实现了基础的流控,当服务端负载过高,客户端发送窗口为 0 时,

新增请求就无法被发送出去,会在缓存到客户端待发送请求队列中,缓存数据过大,

就会造成客户端内存溢出,影响业务程序。

Triple 基于 Netty 实现了 HTTP/2 协议,通过 HTTP/2 FlowController接口统一封装,

在实现分为进站(inbound)和出站(outbound)两个维度的实现。

Triple 在 inbound 流量上使用了 Netty 的默认流控实现,

在 outbound 上实现了自己流控,基于服务端负载,

将服务端流量压力透传到客户端业务层,实现客户端的业务反压,暂停业务继续发送请求,

保护服务端不被大流量击垮。

1、连接初始化

Triple在初次建立连接时,通过 TripleHttpProtocol 初始化 HTTP/2 配置,

默认流控窗口 DEFAULT_WINDOW_INIT_SIZE = MIB_8

并在服务端和客户端加入自己的 outbound 流控接口。

2、Inbound流控

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

1) 入口传入HTTP 流与更新数据大小

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

3) 更新流控窗口

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

3、Outbound流控

Outbound 通过 Triple 自己的流控实现 TriHttpRemoteFlowController

将服务端压力反馈到业务层,保护服务端被大流量击垮。

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

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

3) 反馈客户端流控异常

4、总结

Triple 通过将底层客户端发送窗口为 0 场景封装为特定流控异常,

透传至客户端上层业务,阻止客户端业务继续数据发送,

有效的保护了服务端被大流量击垮和客户端的内存溢出的问题。

三、未来展望

目前 Triple 已经基本实现了流控反压能力,未来我们将深度联动业务,

基于业务负载自适应调整反压流控,

一是在 inbound 上将流控窗口包发送时机调整到服务端业务处理完成后,

二是在 outbound 流量上关联客户端业务层,动态调整客户端发送速率。

从而实现基于服务端业务负载动态反压流控机制。

欢迎在 https://github.com/apache/dubbo 给 Dubbo Star。

搜索关注官方微信公众号:Apache Dubbo,了解更多业界最新动态,掌握大厂面试必备 Dubbo 技能

Dubbo 3 之 Triple 流控反压原理解析的更多相关文章

  1. 1、flink介绍,反压原理

    一.flink介绍  Apache Flink是一个分布式大数据处理引擎,可对有界数据流和无界数据流进行有状态计算. 可部署在各种集群环境,对各种大小的数据规模进行快速计算. 1.1.有界数据流和无界 ...

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

    https://www.jianshu.com/p/2779e73abcb8 看完本文,你能get到以下知识 Flink 流处理为什么需要网络流控? Flink V1.5 版之前网络流控介绍 Flin ...

  3. sentinel流控规则校验之源码分析

    前言: 上节给大家把sentinel流控整个执行大致过了,但涉及到最核心的流控算法还没有讲,先提前说明一下 sentinel用的流控算法是令牌桶算法,参考了Guava的RateLimiter,有读过R ...

  4. 咱们从头到尾讲一次 Flink 网络流控和反压剖析

    本文根据 Apache Flink 系列直播整理而成,由 Apache Flink Contributor.OPPO 大数据平台研发负责人张俊老师分享.主要内容如下: 网络流控的概念与背景 TCP的流 ...

  5. [转帖]实时流处理系统反压机制(BackPressure)综述

    实时流处理系统反压机制(BackPressure)综述 https://blog.csdn.net/qq_21125183/article/details/80708142 2018-06-15 19 ...

  6. flink - 反压

    http://wuchong.me/blog/2016/04/26/flink-internals-how-to-handle-backpressure/ https://ci.apache.org/ ...

  7. 线上应用接入sentinel的第一个流控规则

    sentinel接入第1个应用A以及控制台,已经上线一段时间了,本周接入了第2个应用B: 因为测试同学只有几个,没有压测团队.测试平台.. 各接口能承载的最大qps不确定 ,接入的应用暂时都没有配置规 ...

  8. 性能百万/s:腾讯轻量级全局流控方案详解

    WeTest 导读 全新的全局流控实现方案,既解决了目前流控的实现难点,同时保证运行稳定且流控准确的前提下,实现更简单,部署成本更低,容灾能力更强. 该方案组件化之后,可以推广到别的有需要的部门使用, ...

  9. 又拍云张聪:OpenResty 动态流控的几种姿势

    2019 年 1 月 12 日,由又拍云.OpenResty 中国社区主办的 OpenResty × Open Talk 全国巡回沙龙·深圳站圆满结束,又拍云首席架构师张聪在活动上做了< Ope ...

  10. 性能百万/s:腾讯轻量级全局流控方案详解【转自Wetest】

    阿里用的方案是在nginx中配置限流(限流功能模块是自己开发的),流量统计线上是有监控打通的,具体的限流值是通过线上流量表现+线下性能测试(模拟线上场景)测试得出的. 全新的全局流控实现方案,既解决了 ...

随机推荐

  1. 带你读AI论文丨ACGAN-动漫头像生成

    摘要:ACGAN-动漫头像生成是一个十分优秀的开源项目. 本文分享自华为云社区<[云驻共创]AI论文精读会:ACGAN-动漫头像生成>,作者:SpiderMan. 1.论文及算法介绍 1. ...

  2. 算法设计(动态规划实验报告) 基于动态规划的背包问题、Warshall算法和Floyd算法

    一.名称 动态规划法应用 二.目的 1.掌握动态规划法的基本思想: 2.学会运用动态规划法解决实际设计应用中碰到的问题. 三.要求 1.基于动态规划法思想解决背包问题(递归或自底向上的实现均可): 2 ...

  3. 2022年最新编辑Linux基础知识总结

    文章目录 1.Linux的目录结构 2.远程操作Linux和上传文件到Linux 3.文本编辑 4.快捷键 5.登录.注销.关机.重启 6.用户管理 6.1 .新用户注册 6.2.使用新用户登录 6. ...

  4. 齐博x1 直播神器聊天小插件

    下载地址如下:https://down.php168.com/livemsg.rar 本插件由论坛网友笨熊提供 非常感谢他给大家提供那么一个非常好用的直播必备神器. 如下图所示,大家在直播的时候,这个 ...

  5. 齐博x1当前URL标签

    当前URL标签 {:get_url('location')} 当前URL的二维码标签 {:urls('index/qrcode/index')}?url={:urlencode(get_url('lo ...

  6. go-zero docker-compose 搭建课件服务(二):编写courseware rpc服务

    0.转载 go-zero docker-compose 搭建课件服务(二):编写courseware rpc服务 0.1源码地址 https://github.com/liuyuede123/go-z ...

  7. LcdToos如何在线对屏进行读写指令调试

    在实际屏调试过程中,工程师经常需要对屏的寄存器频繁进行参数修改和读取测试,LcdTools针对这个做了很好的支持,可以在线进行指令调试,大大提高调试效率. 打开点屏工程,连接PX01并使模组上电点亮. ...

  8. 8.pygame-定时器

    使用定时器添加敌机 游戏启动后,每隔一秒出现一架敌方飞机 每架飞机向屏幕下方飞行,速度各不相同 没加敌机出现的水平位置也不进相同 当敌机从屏幕下方飞出,不会再飞回到屏幕中   定时器 pygame中使 ...

  9. JQuery中的DataTables表格插件

    一.DataTables表格插件的简介 DataTables是一个jQuery的表格插件.它具有以下特点: 自动分页处理 即时表格数据过滤 数据排序以及数据类型自动检测 自动处理列宽度 可通过CSS定 ...

  10. RDD(弹性分布式数据集)及常用算子

    RDD(弹性分布式数据集)及常用算子 RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是 Spark 中最基本的数据 处理模型.代码中是一个抽象类,它代表一个 ...