惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
H
Hackread – Cybersecurity News, Data Breaches, AI and More
酷 壳 – CoolShell
酷 壳 – CoolShell
小众软件
小众软件
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
有赞技术团队
有赞技术团队
大猫的无限游戏
大猫的无限游戏
Security Latest
Security Latest
V
V2EX
Hugging Face - Blog
Hugging Face - Blog
IT之家
IT之家
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
月光博客
月光博客
博客园 - Franky
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Simon Willison's Weblog
Simon Willison's Weblog
S
Securelist
T
Threatpost
Last Week in AI
Last Week in AI
P
Privacy International News Feed
S
SegmentFault 最新的问题
aimingoo的专栏
aimingoo的专栏
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
MyScale Blog
MyScale Blog
P
Palo Alto Networks Blog
Cisco Talos Blog
Cisco Talos Blog
T
Tailwind CSS Blog
Blog — PlanetScale
Blog — PlanetScale
G
GRAHAM CLULEY
GbyAI
GbyAI
G
Google Developers Blog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
B
Blog RSS Feed
A
About on SuperTechFans
H
Help Net Security
T
Threat Research - Cisco Blogs
C
Check Point Blog
S
Schneier on Security
Google DeepMind News
Google DeepMind News
T
The Exploit Database - CXSecurity.com
博客园 - 叶小钗
Scott Helme
Scott Helme
博客园 - 司徒正美
美团技术团队
W
WeLiveSecurity
O
OpenAI News
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
AWS News Blog
AWS News Blog
I
InfoQ

李锋镝的博客

LiteLLM 本地代理搭建 Claude-HUD 使用文档 Kratos+ —— Kratos 主题二次开发记录 译文:如何将单体应用拆解为微服务 codebase-memory-mcp 极简完整使用指南 Claude Haiku 4.5、Claude Sonnet 4.6、Claude Opus 4.7 区别以及各自的新特性 SchedulingConfigurer详解 踩坑60+次后,我终于搞懂 Claude Skill 怎么写才会真的触发 Everything Claude Code 详细使用文档 配置Jackson使用字段而不是getter/setter来序列化和反序列化 这个域名注册整整十年了,十年时间,真快啊 Claude Code全维度实战指南:从入门到精通,解锁AI编程新范式 Apollo配置中心中的protalDB的作用是什么 org.apache.ibatis.plugin.Interceptor类详细介绍及使用 岁末 Excel2016右键新建工作表,打开时提示“因为文件格式或文件扩展名无效。请确定文件未损坏,并且文件扩展名与文件的格式匹配。”的解决办法 wordpress增加说说功能 玩博客的人是不是越来越少了? Java 为什么有这么多 “O”? 别再背线程池的七大参数了,现在面试官都这么问 2024年11月1号 农历十月初一 我的第一个WordPress插件:Dylan Custom Plugin上线了 推荐一款比较养眼的Xshell配色方案 hnswlib installation failed 开工啦~ 阳了... MybatisCodeHelperPro激活 @Async注解的坑 新买的笔记本发货啦…… 这个中秋节感觉过的好累啊 IDEA下载源码报:Cannot connect to the Maven process. Try again later. RocketMQ的push消费方式实现详解 看病难~取药难~~ 笑死、腹肌……根本不可能有腹肌的~~ 居家办公了~ C# 11 的这个新特性,我愿称之最强! IntelliJ IDEA 2020.3.x永久白嫖(Windows/Mac) IDEA无限试用方法【2020.3最新亲测有效】 SpringBoot使用注解的方式构建Elasticsearch查询语句,实现多条件的复杂查询 UUID太长怎么办?快来试试NanoId 忽然发现,在校大学生可以免费领一年有道云笔记会员~ 醒醒~补个税了 使用itext和freemarker来根据Html模板生成PDF文件,加水印、印章 来来来,用python画一个冰墩墩儿 SpringBoot整合GraphQL入门教程 办理居住证困难重重啊! 妈呀,昨天晚上睡觉做了一晚上的梦,可累死我了 感觉Typecho很简洁啊…… WordPress的自动更新好烦啊 BeanCopier工具类(性能优化工具类) 内存屏障浅析 居住证可算是申请通过了…… 试了下壁挂炉供暖 关于重阳节 居住证签注... Spring Boot 2.x使用PostgreSQL数据库 十一节后开工头一天,修了个耳机…… 玉楼春·尊前拟把归期说 nginx反向代理配置去除前缀 1931→2021! Navicat Premium数据库账号密码解密 百度的索引量数据现在有点儿太夸张了吧? 哇塞~这个小姐姐实在太惊艳了…… 关于8月29号下午博客故障的一些记录 基于Java8的Either类 海琴烟~~~ JMX监控权限认证配置 IntelliJ IDEA 2019.3.3 永久激活 破解[Windows] SpringBoot整合Elasticsearch详细步骤以及代码示例(附源码) SpringBoot整合Elasticsearch游标查询(scroll) GitLab创建新项目,初次提交命令和流程 吐槽下Google浏览器~ 从零搭建Spring Cloud Gateway网关(一) 从零搭建Spring Cloud Gateway网关(二)—— 打印请求响应日志 博客有logo啦 你的答案 数据库事务的一点简单总结 Spring Boot发展史(Spring Boot介绍) 【漫画】戏说外行对程序员的误会有多深 【收藏】从面试官角度观察到的程序员技能瓶颈,同时给出突破瓶颈的建议 Git中.gitignore文件不起作用的解决办法 背影 - 朱自清 jmap命令(jdk1.8) 彻底搞懂mysql日志系统binlog,redolog,undolog 出院了~~~ linux中ftp查看不到文件列表的问题 PHP版本怎么更新啊…… 成语接龙 StarUML4.0破解文件 Java SPI详解 WordPress评论框增加自定义表情 因在公司上不正经网站,我没过试用期… 优化了MYSQL大量写入问题,老板奖励了1000块给我 不慌不忙的坚强(林徽因39段最美文字!) ConcurrentHashMap常用方法源码解析(jdk1.8) 我是如何失去团队掌控的? HBASE填坑日志 关闭apache httpclient4.5 DEBUG日志 使用OpenShift搭建k8s集群 SonarQube Scanner的配置与使用简介
如何形象的描述反应式编程中的背压(Backpressure)机制?
李锋镝 · 2021-08-26 · via 李锋镝的博客

首先,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