李锋镝的博客

  • 首页
  • 时间轴
  • 说说
  • 每日心情
  • Now
  • 系列文章
  • 论坛
  • 左邻右舍
    • 左邻右舍
    • 博友圈
  • 留言
    • 留言
    • 走心评论
  • 关于
    • 关于本站
    • 网站地图
    • 网站统计
    • 另一个网站
    • 我的导航站
    • 赞助
  • 🚇开往
!Destiny
惟坚韧者始能遂其志
  1. 首页
  2. 转载
  3. 技术
  4. 正文

如何形象的描述反应式编程中的背压(Backpressure)机制?

2021年8月20日 约 1,639 字6 分钟 199 1 3
本文最后更新于 2021年8月20日,距今已 1858 天,其中的信息可能已经发生变化,请注意甄别。

首先,Backpressure 并不是响应式编程(Reactive Programming,或者有的人喜欢按字直译为「反应式编程」)独有的;其次,Backpressure 并不是一种「机制」,也不是一种「策略」。Backpressure 其实是一种现象:在数据流从上游生产者向下游消费者传输的过程中,上游生产速度大于下游消费速度,导致下游的 Buffer 溢出,这种现象就叫做 Backpressure 出现。

编程中的 Backpressure 这个概念源自工程概念中的 Backpressure:在管道运输中,气流或液流由于管道突然变细、急弯等原因导致由某处出现了下游向上游的逆向压力,这种情况称作「back pressure」。这是一个很直观的词:向后的、往回的压力——back pressure。可是,国内的热力工程界对这个词的正式翻译是「背压」,把「back」翻译成了「背」,着实有点让人无力吐槽。

相辅相成地,由于「back pressure」被国内翻译为了「背压」,那么这个概念对于国内的程序员来说就更加难懂了,很多人对此或多或少加了一些自己的猜测:「背压?来自背后的压力?是说上游给下游的压力太大了吗?」

其实程序开发中的 Backpressure ,只是一种和工程上的 back pressure 相似的概念,我在这里再重复一遍:在数据流从上游生产者向下游消费者传输的过程中,上游生产速度大于下游消费速度,导致下游的 Buffer 溢出,这种现象就叫做 Backpressure 出现。需要强调的是:这句话的重点不在于「上游生产速度大于下游消费速度」,而在于「Buffer 溢出」。

Backpressure 和 Buffer 是一对相生共存的概念,只有设置了 Buffer,才有 Backpressure 出现;只要设置了 Buffer,一定存在出现 Backpressure 的风险。

不懂?我举个实际的例子。

例如你是开发服务器后端的,有一个 Socket 不断地接收来自用户的 http 请求来把用户需要的网页返回给用户。你的服务器所能承受的同时访问用户数是有上限的吧?比如说,你的服务器主机的处理器和内存情况决定了,它最多只能承受 5000~6000 个用户同时访问,再多的话服务器就有当掉的风险了。那么你决定:把用户数上限设置为 5000,当超出 5000 用户数的时候,再有新的访问就把它丢弃或者拒绝。那么对于这个案例,5000 就是你对于用户访问数设置的 Buffer;第 5001 个用户的访问,就叫做造成了 Backpressure 的产生;而你的「丢弃或拒绝」的行为,就是对于 Backpressure 的处理。

我来多问几个问题来把事情说得更加透彻一点。

为什么要设置 Buffer?

因为下游消费速度小于上游生产速度(对用户访问的处理速度小于新访问的出现速度)。

为什么要丢弃 Backpressure 出现时的新事件?

  1. 因为处理不过来(本来就是因为处理不过来,所以才设置了 Buffer 的)
  2. 因为事件可丢弃。

有人说了,卧槽卧槽要死要死,你敢说用户的请求可以丢弃?打你哦。

是的,就是可以丢弃。由于消费速度可能会小于生产速度,所以才设置了 Buffer;而由于一些外部条件的限制(例如主机内存大小),所以 Buffer 需要有上限;而当 Backpressure 出现时,你其实已经在面临「要么丢弃新事件,要么系统崩溃」的选择。所以说是选择,其实根本没得选,只能选择丢弃新事件。

所以明白了吗?

生产速度大于消费速度,所以需要 Buffer;

外部条件有限制,所以 Buffer 需要有上限;

Buffer 达到上限这个现象,有一个简化的等价词叫做 Backpressure;

Backpressure 的出现其实是一种危险边界,唯一的选择是丢弃新事件。

这就是 Backpressure 的本质。

再给个实用性的总结:

永远不要用「上游生产速度是否大于下游消费速度」来判断你的某个模块是否需要 Backpressure 的支持,因为现实场景是不可预估的,生产速度总是有一定的可能会大于下游消费的速度,所以 Buffer 是永远需要的。再所以:

  1. 只要你的上游生产速度不会快到把系统搞崩溃,那么不用设置 Buffer 上限(从而也就不用考虑 Backpressure),随它去吧。例:按钮点击事件与处理点击 -> 就算这个事件处理很慢,就算这个用户的手点抽筋了,他能点多快?
  2. 只有上游生产速度可能会快到把系统搞崩溃,并且事件是可以丢弃的,才需要设置 Buffer 上限。当 Buffer 有上限的时候,Backpressure 也就存在了出现的可能。一旦 Backpressure 出现,只能选择丢弃,只是具体的丢弃策略可能不同(全部丢弃、只保留最新的一个而丢弃其余的等等,但丢弃是不变的基本原则)。例:前面提到的服务端处理用户请求。
  3. 如果上游生产速度可能会快到把系统搞崩溃,而事件也不可丢弃,怎么办?这个时候,你就要修改程序的设计了:修改代码设计来规避风险,或者修改软件设计、通过让步的方式来从根源上避免问题发生。总之,这已经不是 Buffer 或者 Backpressure 能解决的问题了。

总结:Backpressure 指的是在 Buffer 有上限的系统中,Buffer 溢出的现象;它的应对措施只有一个:丢弃新事件。

Backpressure 只是一种现象,而不是一种机制

原文链接:https://www.zhihu.com/question/49618581/answer/237078934

除非注明,否则均为李锋镝的博客原创文章,转载必须以链接形式标明本文链接

本文链接:https://www.lifengdi.com/transport/3465

本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可
分享到

如何形象的描述反应式编程中的背压(Backpressure)机制?

也可使用浏览器菜单中的「分享」功能

微信扫一扫分享

标签: Backpressure Netty 背压
最后更新:2021年8月20日

岁月同一天 9 月 22 日

回望过去的今天,你在写什么

  • 3 年前 2023年9月22日
    《人生海海》读后感

    前段时间读完了麦家的《人生海海》,起初对人生海海这个词不太理解,记得第一次听到这个词,应该是在《欢喜就好》这首歌里,里面…

  • 4 年前 2022年9月22日
    OHCache使用

    OHCache介绍 缓存框架OHC基于Java语言实现,并以类库的形式供其他Java程序调用,是一种以单机模式运行的堆外…

李锋镝

既然选择了远方,便只顾风雨兼程。

打赏 点赞
< 上一篇
下一篇 >
1234567891112131415161718192021222324252627282930313233343536373839404142434446474849505152535455575859606162636465666769727476777879808182858687909293949596979899
取消回复
…

文章评论

  • 强仔Lv 2

    :huaji8:

    AndroidAndroidChrome 88.0.4324.93Chrome 88.0.4324.93中国中国-河南-驻马店
    2021年8月26日
    00 回复
  • yangxuan_321@163.comLv 1

    另外我觉得这一块儿akka在反应式架构的支持是更优美的

    WindowsWindowsChrome 92.0.4515.107Chrome 92.0.4515.107中国中国-广东-深圳
    2021年8月24日
    00 回复
  • yangxuan_321@163.comLv 1

    我一直喜欢叫 回压而非背压

    WindowsWindowsChrome 92.0.4515.107Chrome 92.0.4515.107中国中国-广东-深圳
    2021年8月24日
    00 回复
  • 当你凝视深渊时,深渊也在凝视你。

    听点儿音乐吧 朋友~
    文章目录
    最新 热点 随机
    最新 热点 随机
    让WordPress静态化之Rocket‑Nginx WordPress下一代默认主题Ipsum预览 C++之父重磅发声:AI编程正在毁掉一代程序员 支撑全网40%网站的WordPress正在重新拥抱PHP生态 Kratos-plus v1.1.24版本更新说明 关于主题加载速度优化的一点儿小演进
    关于主题加载速度优化的一点儿小演进给主题增加了Now、每日心情、年度回顾、岁月同一天、随机漫步等功能WordPress缓存插件WP Fastest Cache、WP Rocket 、FlyingPress对比关于使用AI的一些思考Kratos+ v1.1.16版本更新说明AI时代,个人技术博客的出路在哪里?
    Gemini 3 前端开发革命:从原型到 3D 应用,一句话搞定全栈开发(2025 实测) 手把手教你在 KubeSphere 上构建自托管 AI 助手:基于 Open WebUI 实现企业级私有智能平台 JAVA关键字之volatile关键字说明 docker registry私库镜像删除 Kafka 为什么要抛弃 Zookeeper? 分布式ID生成算法SnowFlake(雪花算法)Java源码
    最近评论
    李锋镝 发布于 2 天前(09月20日) 静态博客我之前也用过,但是感觉不是很方便,后来就一直用的WordPress
    Sheep5 发布于 2 天前(09月20日) 我直接用静态博客,天然有速度优势。
    不凡 发布于 2 天前(09月20日) 主要是wordpress插件丰富,需要什么功能插件,插件市场应有尽有,typecho是性能更好、更轻...
    李锋镝 发布于 2 天前(09月20日) 忒极简了,而且这个布局我也搞不懂
    李锋镝 发布于 2 天前(09月20日) 哈哈哈~自定义的功能都是符合自己需求的
    标签聚合
    ElasticSearch 多线程 SQL WordPress Claude K8s JVM IDEA 架构 AI编程 MQ MySQL AI Redis 分布式 JAVA 日常 数据库 SpringBoot Spring
    友情链接
    • 林羽凡
    • 彬红茶日记
    • Mr.Sun的博客
    • 知向前端
    • Honesty
    • 九仞之行
    • 若梦博客
    • 瓦匠个人小站
    • 临窗旋墨
    • 搬砖日记
    • 韩情脉脉
    • 皮皮社
    • lijie blog
    • 哥斯拉
    • Serendipity
    • sssr7844的博客
    • 志文工作室
    • 蜗牛工作室
    • 韩小韩博客
    • 老张博客

    COPYRIGHT © 2016-2026 lifengdi.com. ALL RIGHTS RESERVED.

    lifengdi.com

    Domain age badge for lifengdi.com

    Theme Kratos-plus By Dylan Li

    津ICP备2024022503号-3

    京公网安备11011502039375号