流处理中的背压是什么意思?

7
我开始学习NodeJS,流似乎是人们经常使用的东西。在我阅读的大部分文档中都提到了“背压问题”,这个问题在处理大文件时会出现,但我还没有找到一个清晰的解释来说明这个问题究竟是什么。我也读到过使用管道可以帮助解决这个问题,但是管道到底如何解决背压问题呢?
提前感谢任何解释。

2
想象一下你有类似于readStream.pipe(writeStream)的东西。当writeStream无法像readStream推送数据一样快地消耗数据时,就会出现背压问题。这篇文章很好地解释了这个问题以及如何处理它。 - idbehold
非常感谢,那篇文章真的很有帮助。 - David Florez
@idbehold,链接无效。你有其他链接吗? - Mandroid
1
@Mandroid https://github.com/creationix/howtonode.org/blob/master/articles/streams-explained.markdown - idbehold
谢谢提供链接。 - Mandroid
链接也已存档:https://archive.is/KZabP - uzluisf
1个回答

6

背压是指在写入流的速度超过其他进程可以处理/消耗的速度时出现的情况。使用管道,您可以控制信息流量,暂停和恢复流;以下是在nodejs中实现背压的示例:

var http = require('http'),
    fs = require('fs');

var server = http.createServer(function(request, response) {
  var file = fs.createWriteStream('upload.jpg'),
      fileBytes = request.headers['content-length'],
      uploadedBytes = 0;

  request.on('data', function(chunk) {
    uploadedBytes += chunk.length;
    var progress = (uploadedBytes / fileBytes) * 100;
    response.write('progress: ' + parseInt(progress, 10) + '%\n');

    var bufferOK = file.write(chunk);

    if (!bufferOK) {
      request.pause();
    }
  });

  file.on('drain', function() {
    request.resume();
  });

  request.on('end', function() {
    response.end('upload complete\n');
  });

});

server.listen(8080);

Ben Foster 解决方案 - 来源:https://gist.github.com/benfoster/9543337


客户端在通道暂停时必须如何反应?它能否继续丢弃请求,假设底层传输系统控制一切(实际上不是这样,因为某些地方有限制的缓冲区/队列)? - Simon Logic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接