AI智能
改变未来

[翻译] Backpressure explained — the resisted flow of data through software

Backpressure 我会直译为背压

背压是每个软件工程师在某个时候都需要处理的问题。在这篇文章中,我将会阐述什么是背压,为什么背压是常见的,以及怎样缓解它。

The Definition

在编程的世界中,背压一词借鉴自流体力学。

wiki 中是这样定义背压的

Resistance or force opposing the desired flow of fluid through pipes.

水流通过管道的阻力

在软件行业中,这个定义就变成了

Resistance or force opposing the desired flow of data through software.

软件正常处理数据流的阻力

软件的最终目的是接收输入,将输入转换为目标输出。对 API 而言,这个输出可能是一个 Json 对象,对于网页而言,这个输出可能是一个 HTML 文本,对于显示器而言,这个输出则是一个个像素。

背压则是指阻碍输入转换为输出这个过程的阻力。比如计算速度就是一种阻力。不停有数据被输入进来,但是计算速度却跟不上的话,就会出问题。背压也可能是别的因素造成的,例如:你的计算机需要等待用户的输入。

Examples of Backpressure

I Love Lucy: Chocolate Factory

我们从一个例子开始,在 50s 的 TV show 中有这样一幕,Lucy 在一个巧克力工厂工作,她的任务是将糖果从传送带上面取下来并将它包装到纸里面,工作内容很简单。但是她很快发现传送带的速度远远超过了她包装糖果的速度,接着闹剧就发生了。

这是背压的一个完美例子,Lucy 最终采取了两种方式去处理,把一些糖果放在一边等空闲时再处理(buffering);把糖果吃进肚子里并把一些糖果藏在帽子里(dropping)。然而,在巧克力工厂的例子中,这两种做法都起不了作用。实际上,她真正需要做的是降低传送带的速度。换句话说,她需要去控制生产者的速度,我们稍后会讨论更多策略。

Reading and Writing Files

现在我们来讨论一下软件相关的背压,最常见的例子是读写文件。

写文件的速度远低于读文件的速度,假设现在有一个硬盘,它的读速率是150MB/s, 写速率是 100MB/s,如果你尽可能快的将文件读取到内存,同时也尽可能快的将文件写到磁盘上,你每秒将会消耗 50MB 的缓冲区,并且这个数字会不停扩大。在文件被读完前,你不可能缩小这个数字。

现在假设对一个 6GB 大小的文件执行上述操作,在你把整个文件读完之前,你需要一个 2GB 的缓冲区来完成写操作。

6 GB / 150 MB = 40 seconds150 MB - 100 MB = 50 MB deficit50 MB x 40 = 2 GB !!!

这太费内存了,在某些系统上,这将会超过最大的可用内存。假设这是一个 web 服务器,对每个请求都执行这种操作。很明显,这种做法在很多情况下是行不通的。

但是不用怕,解决方法也很简单,只需要将读取速度和写入速度保持一致就好了,几乎所有个 IO 库都会为你自动做这些工作的抽象,通常基于

streams

pipes

的观念。

Backpressure Strategies

除了增加可用的计算资源,处理背压的策略可以用下面三种方法概括起来:

  1. 控制生产者 (根据消费者来升高/降低生产速率)
  2. 缓冲 (当峰值来临时,将一些数据临时缓存起来)
  3. 抛弃 (仅从输入数据中采样部分数据进行处理)

原文:

  • Drop (sample a percentage of the incoming data)
  • Control the producer (slow down/speed up is decided by consumer)
  • Buffer (accumulate incoming data spikes temporarily)

reference

[https://medium.com/@jayphelps/backpressure-explained-the-flow-of-data-through-software-2350b3e77ce7](

赞(0) 打赏
未经允许不得转载:爱站程序员基地 » [翻译] Backpressure explained — the resisted flow of data through software