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
    (而不是
    通过2并发
    ):在数千个对象通过后接收ETIMEOUT
  • 将高水位线设置为18000: 这是唯一有效的办法。如果我更改此
    highWatermark
    值,我可以处理所有对象,但这实际上只是问题的一个解决方案。我想知道为什么这样做有效,以及我能做些什么以一种稳健的方式解决我的流媒体问题
设置
highWaterMark
如下所示:

const analyticsTransformer = through2Concurrent.obj({
  highWaterMark: 18,000,
  maxConcurrency: 15
}, async (doc, enc, cb) => {
  // ...
});
为什么更改
highWaterMark
值有效

我提前终止流的真正原因是什么

我怎样才能修好它

提前感谢任何能提供帮助的人!:)