【发布时间】:2015-05-23 00:21:35
【问题描述】:
我们有一个 mongoosejs 客户端,它查询大型 mongodb 集合(大约 1000 万条记录)并通过管道传输到转换流。当我们运行这段代码时,节点进程占用了 100% 的 CPU 并变得忙碌,这表明背压建立了。如果我们周期性地强制读取流的 pause(),比如每 100 条记录,持续 10 毫秒,CPU 就不会那么忙。
我了解流 API 应该检测“背压”问题并在开发人员无需调用 pause() 和 resume() 的情况下处理它们。为什么 CPU 对这段代码如此忙碌,开发这样的管道的最佳实践是什么?
var Transform = require('stream').Transform;
var util = require('util');
var zlib = require("zlib");
var Model = mongoose.model("xxx", someSchema)
var TransformStream = function() {
return Transform.call(this, {
objectMode: true
});
};
util.inherits(TransformStream, Transform);
var transformChunk = function(chunk){
//return transformed chunk here
}
TransformStream.prototype._transform = function(chunk, encoding, callback) {
var transformed = transformChunk(chunk);
this.push(transformed, "utf-8");
callback();
}
function main(){
var zipStream = zlib.createGzip();
var transformer = new TransformStream();
var queryStream = Model.find(filter).stream();
// outstream is a grid fs stream
return queryStream.pipe(transformer).pipe(zipStream).pipe(outstream);
}
【问题讨论】:
标签: node.js stream mongoose transform