node.js如何处理快速生产者和缓慢消费者的背压

时间:2018-05-01 10:14:44

标签: node.js node-streams backpressure

我在node.js中非常新手,并且不了解有关流的文档。希望得到一些提示。

我正在阅读一个非常大的文件行,然后为每一行我调用异步网络api。

显然,本地文件的读取速度比完成异步调用要快得多:

var lineReader = require('readline').createInterface({
  input: require('fs').createReadStream(program.input)
});

lineReader.on('line', function (line) {
    client.execute(query, [line], function(err, result) {
        // needs to pressure the line reader here
        var myJSON = JSON.stringify(result);
        console.log("line=%s json=%s",myJSON);
    });
});

在"执行"中添加背压的方法是什么?方法

1 个答案:

答案 0 :(得分:2)

解决方案是将异步行为包装在流编写器中并从编写器中限制异步读取器:

val count = 0;
var writable = new stream.Writable({
    write: function (line, encoding, next) {
        count++;
        if (count < concurrent) {
            next();
        }

        asyncFunctionToCall(...) {
            // completion callback
            // reduce the count and release back pressure
            count--;
            next();
            ...
      }
});

var stream = fs.createReadStream(program.input, {encoding: 'utf8'});
stream = byline.createStream(stream);
stream.pipe(writable);