技术交流QQ群【JAVA,C++,Python,.NET,BigData,AI】:170933152

Backpressure 并不是响应式编程(Reactive Programming,或者有的人喜欢按字直译为「反应式编程」)独有的;

其次,Backpressure 并不是一种「机制」,也不是一种「策略」。

Backpressure 其实是一种现象:在数据流从上游生产者向下游消费者传输的过程中,上游生产速度大于下游消费速度,导致下游的 Buffer 溢出,这种现象就叫做 Backpressure 出现。

编程中的 Backpressure 这个概念源自工程概念中的 Backpressure:在管道运输中,气流或液流由于管道突然变细、急弯等原因导致由某处出现了下游向上游的逆向压力,

这种情况称作「back pressure」。这是一个很直观的词:向后的、往回的压力——back pressure。可是,国内的热力工程界对这个词的正式翻译是「背压」,

把「back」翻译成了「背」,着实有点让人无力吐槽

其实程序开发中的 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 出现时,你其实已经在面临「要么丢弃新事件,要么系统崩溃」的选择。所以说是选择,其实根本没得选,只能选择丢弃新事件。

再给个实用性的总结:

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

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

作者:扔物线
链接:https://www.zhihu.com/question/49618581/answer/237078934
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

微服务升级_SpringCloud Alibaba工作笔记0002---理解反应式编程中的背压(Backpressure)机_流的逆向压力相关推荐

  1. Seata多微服务互相调用_全局分布式事物使用案例_业务数据库准备---微服务升级_SpringCloud Alibaba工作笔记0059

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 先来说一下,这里alibaba,可以看到用到对微服务的保护,alibaba就提供了 一个senti ...

  2. 微服务升级_SpringCloud Alibaba工作笔记0003---理解spring webflux_响应式堆栈_提高微服务吞吐量和伸缩性

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 1. WebFlux介绍 Spring WebFlux 是 Spring Framework 5. ...

  3. Seata多微服务互相调用_全局分布式事务使用案例_seata之原理剖析---微服务升级_SpringCloud Alibaba工作笔记0066

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 通过上面的案例,我们已经可以会使用seata进行全局的分布式事物的使用了,在多微服务相互调用的环境 ...

  4. Seata多微服务互相调用_全局分布式事物使用案例_@GlobalTransactional验证---微服务升级_SpringCloud Alibaba工作笔记0065

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 然后咱们前面都已经把,订单微服务,库存微服务,账户微服务都弄好了,然后 咱们可以去进行下单操作了. ...

  5. Seata多微服务互相调用_全局分布式事物使用案例_Account-Module 账户微服务说明---微服务升级_SpringCloud Alibaba工作笔记0064

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 这里我们再去做咱们的账户微服务 这个微服务是2003,账户微服务 然后2003,这个账户微服务,可 ...

  6. Seata多微服务互相调用_全局分布式事物使用案例_Storage-Module 仓储微服务说明---微服务升级_SpringCloud Alibaba工作笔记0063

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 接下来咱们看一下这个库存的微服务 先去订单微服务中,看看订单的controller. 然后订单的s ...

  7. Seata多微服务互相调用_全局分布式事物使用案例_Order-Module order微服务的配置搭建_写代码下---微服务升级_SpringCloud Alibaba工作笔记0062

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 然后我们接着完善我们的订单微服务 我们写完StorageService这个库存的远程调用以后 然后 ...

  8. Seata多微服务互相调用_全局分布式事物使用案例_Order-Module order微服务的配置搭建_写代码上---微服务升级_SpringCloud Alibaba工作笔记0061

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 然后咱们继续写这个使用seata实现分布式事物调用的案例,上节配置完 微服务的环境以后,然后我们可 ...

  9. Seata多微服务互相调用_全局分布式事物使用案例_Order-Module order微服务的配置搭建---微服务升级_SpringCloud Alibaba工作笔记0060

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 然后咱们说了我们的案例需要三个微服务,那么首先我们先去创建这个 订单微服务. 按照这个11个步骤来 ...

最新文章

  1. 男女洗澡前后区别,太形象了!
  2. creat_caltab生成六边形标定板(黑底白点)
  3. 使用友盟的社会化组件,发新浪微博的 error:redirect_uri_mismatch的解决方法
  4. 蓝桥杯-最小乘积(java)
  5. 【奥运代表团加油】ABAP字符处理杂例
  6. Js判断下拉框是否为空值
  7. pdf英文转换成html网页,PDF文件转换成html网页文件小方法
  8. An Introduction to Unstructured Mesh Generation Methods and Softwares for Scientific Computing
  9. 5.6.1 Boolean类型
  10. python 画图十大工具_python实现画图工具
  11. 音频处理-2 WAV格式
  12. 中文名转换成英文名(c#)
  13. java语言保留结构和联合_Java 语言中取消了联合概念,保留了结构概念。( )_学小易找答案...
  14. 在阿里云 ACK 上部署 EMQX MQTT 服务器集群
  15. 紧跟年轻潮流趋势,嘻哈歌手代言三星Galaxy C8发布
  16. Linux运维就业前景如何?
  17. 纽曼硬盘盒拆卸_旧硬盘是否可以安全拆卸?
  18. MIPS汇编模拟器_Mars的使用
  19. java之面向对象:继承extends、super、覆盖override的用法
  20. Windows Linux 相同功能软件对应列表(转)

热门文章

  1. JAVA:基础递归算法大杂烩
  2. SSM整合项目实践——完成图书的CRUD
  3. MyBatis入门让它跑起来
  4. VS2008+Qt 项目目录
  5. Extjs chart 丰富呈多个数据形式
  6. Chef宣布100%开源,要走红帽模式?\n
  7. SQLmap学习使用
  8. Pycrypto与RSA密码技术
  9. 解决mac使用svn: E170000: Unrecognized URL scheme for h
  10. testlink(以及服务器)问题定位思路