Node.js -真正大的流是阻塞和CPU密集型的



我们有几个数据库调用,可以轻松地流式传输100K记录。我们遇到的问题是,每当我们使用这些流之一时,它就会占用CPU,似乎会阻塞所有其他进程。

我已经尝试了一些不同的黑客来缓解这个问题,但我现在有点卡住了。这是我最近的一次尝试,将流管道到使用process.nextTick的Transform。

var stream = require('stream');
var util   = require('util');
function StreamThrottler() {
  stream.Transform.call(this, { objectMode: true });
}
util.inherits(StreamThrottler, stream.Transform);
StreamThrottler.prototype._transform = function(chunk, encoding, cb) {
  process.nextTick(function() {
      console.log('chunk');
      // note: I'm intentionally not pushing the chunk 
      // onto the stream for testing
      cb();
  });
};
StreamThrottler.prototype._flush = function(cb) {
  cb();
};
var streamThrottler = new StreamThrottler();
// now the db call
this.largeDatabaseResultStream().pipe(streamThrottler);

我注意到这个Node.js问题可能是相关的,也可能不是。

有没有人对如何解决这个问题有其他的想法?

当您使用objectMode: true时,本机流实现可能必须缓冲和序列化数据。

所以使用节流流的想法是一个很好的,所以也许这个流将使用objectMode: false和下游流,你可以使用方便的objectMode: true

注意,混合不同类型的流可能会给你一些错误。
{objectMode: false} ==> {objectMode: true}是ok的(缓冲区只是另一种对象)
{objectMode: true} ==> {objectMode: false}不行(除非数据本身是缓冲区)

相关内容

  • 没有找到相关文章

最新更新