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

时间:2014-05-06 18:46:15

标签: javascript node.js stream streaming

我们有一些数据库调用可以轻松传输100K记录。我们遇到的问题是,无论何时我们使用其中一个流,它都会占用CPU并且似乎阻止所有其他进程。

我已经尝试了一些不同的黑客来缓解这种情况,但现在有点卡住了。这是我最近尝试将流管道传输到使用process.nextTick的转换。

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);

我注意到this Node.js问题可能相关也可能不相关。

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

1 个答案:

答案 0 :(得分:0)

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

所以使用throttler流的想法很好,所以这个流可能会使用objectMode: false并向下流,你可以使用方便的objectMode: true

请注意,混合不同类型的流可能会给您带来一些错误 {objectMode: false} ==> {objectMode: true}没问题(缓冲区只是另一种对象)
{objectMode: true} ==> {objectMode: false}不正常(除非数据本身就是缓冲区)