NodeJS请求管道缓冲区大小

时间:2017-07-21 13:42:01

标签: node.js request aws-lambda

如何在NodeJS Request管道上设置最大缓冲区大小?我尝试使用AWS Lambdasource和管道上传下载到destination,如下面的代码所示:

request(source).pipe(request(destination))

此代码工作正常,但如果文件大小大于AWS Lambda内存大小(下图),则崩溃。如果我增加内存,它可以工作,所以我知道不是超时或链接,而只是内存分配。最初我没有增加数量,但即使我使用最大数量,仍然是1.5GB,我期望传输大于此的文件。

AWS Lambda上的NodeJS是否有全局变量?还是其他任何建议?

1 个答案:

答案 0 :(得分:0)

要考虑的两件事:

  1. 请勿在promise(异步/等待)中或在promise(异步/等待)中使用request(source).pipe(request(destination))。由于某些原因,使用诺言完成后,内存会泄漏。

“但是,不鼓励流式响应(例如.pipe(...)),因为Request-Promise会增加不必要的大请求的内存占用。为此,请使用原始的Request库。您可以在同一项目。”来源:https://www.npmjs.com/package/request-promise

  1. 要控制管道使用多少内存:为管道的两个末端设置highWaterMark。我重复:管道的两端。这将迫使管道只允许大量数据进出管道,从而限制其在内存中的占用。 (但不限制数据在管道中移动的速度...请参阅奖励)

request.get(sourceUrl,{highWaterMark:1024000,encoding:null})。pipe(request(destinationUrl,{highWaterMark:1024000));

1025000以字节为单位,约为10MB。

highWaterMark背景的来源: “由于双工流和变换流都是可读和可写的,因此每个流维护两个用于读取和写入的独立内部缓冲区,从而允许每一侧在保持适当和有效的数据流的同时彼此独立地进行操作。例如,net.Socket实例是双工流,其“可读取”侧允许使用从套接字接收的数据,而“可写侧”允许将数据写入到套接字。由于数据写入套接字的速度可能比接收数据快或慢,因此对于每一侧都非常重要彼此独立地操作(和缓冲)。” <-这最后一句话很重要。

https://nodejs.org/api/stream.html#stream_readable_pipe_destination_options

  1. 奖金:如果您想限制数据通过管道的传输速度,请检查以下内容:https://www.npmjs.com/package/stream-throttle

const油门= require('stream-throttle');

let th =新的节气门。Throttle({rate:10240000}); //如果您不想传输速度超过10mb / sec

request.get(sourceUrl,{highWaterMark:1024000,encoding:null})。pipe(th).pipe(request(destinationUrl,{highWaterMark:1024000));