Node.js 异步转换结束过快的长对象流
我正在使用Node.js 异步转换结束过快的长对象流,node.js,stream,through2,Node.js,Stream,Through2,我正在使用到2 concurrent将节点请求的响应管道化到转换流中。此响应作为缓冲区进入,并使用JSONStream解析为对象。然后通过管道传输到我的转换流中。然后,transform stream函数发出HTTP请求,格式化响应并将其存储到MongoDB中。我们之所以使用并发流,是因为如果不使用并发流,则需要花费不可接受的很长时间来处理所有事情 响应流->JSONStream.parse()->转换流 问题描述 一旦解析,初始响应流包含大约18000个对象。但是,流终止,并在处理所有1800
到2 concurrent
将节点请求的响应管道化到转换流中。此响应作为缓冲区进入,并使用JSONStream
解析为对象。然后通过管道传输到我的转换流中。然后,transform stream函数发出HTTP请求,格式化响应并将其存储到MongoDB中。我们之所以使用并发流,是因为如果不使用并发流,则需要花费不可接受的很长时间来处理所有事情
响应流->JSONStream.parse()->转换流
问题描述一旦解析,初始响应流包含大约18000个对象。但是,流终止,并在处理所有18000个对象之前接收到
finish
事件。不会抛出错误,但在流结束之前,实际上只处理了大约2000-5000个对象。处理的确切数字各不相同
以下是相关代码:
const analyticsTransformer = through2Concurrent.obj({
maxConcurrency: 15
}, async (doc, enc, cb) => {
// Make an http request. This is a relatively long request.
const res = await apim.getAnalytics(doc);
// Save response to mongo.
await UsageData.save(res);
cb();
});
// Kick off the streaming.
broker.getInstances()
.pipe(JSONStream.parse('*')
.pipe(analyticsTransformer)
.on('finish', () => {
// We reach this way too quickly before we have handled all 18,000 objects
})
.on('error', err => {
// No errors are caught.
})
我尝试过的
- 等待“结束”事件:相同的结果。未处理的对象和提前终止
- 使用
(而不是通过2
):在数千个对象通过后接收ETIMEOUT通过2并发
- 将高水位线设置为18000:
这是唯一有效的办法。如果我更改此
值,我可以处理所有对象,但这实际上只是问题的一个解决方案。我想知道为什么这样做有效,以及我能做些什么以一种稳健的方式解决我的流媒体问题李>highWatermark
highWaterMark
如下所示:
const analyticsTransformer = through2Concurrent.obj({
highWaterMark: 18,000,
maxConcurrency: 15
}, async (doc, enc, cb) => {
// ...
});
为什么更改highWaterMark
值有效
我提前终止流的真正原因是什么
我怎样才能修好它
提前感谢任何能提供帮助的人!:)