【问题标题】:NodeJS Request Pipe buffer sizeNodeJS 请求管道缓冲区大小
【发布时间】:2017-07-21 13:42:01
【问题描述】:

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

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

此代码运行良好,但如果文件大小大于 AWS Lambda 内存大小(下图),它会崩溃。如果我增加内存,它会起作用,所以我知道不是超时或链接,而只是内存分配。最初我并没有增加数量,但即使我使用最大,仍然是 1.5GB,并且我希望传输比这更大的文件。

AWS Lambda 上是否有一个用于 NodeJS 的全局变量?还是有其他建议?

【问题讨论】:

  • 阅读:nodejs.org/api/stream.html#stream_buffering 管道自动管理数据流以防止内存使用失控,所以我不确定你的代码是否显示是您的问题的实际原因。
  • 如果 AWS Lambda 内存小于文件会失败,所以我知道是内存。 NodeJS 最多可以分配 2GB,对吧?但我想要更小的东西,也许是 128MB,就像 AWS Lambda 设置一样。这是完整的来源,但基本上是问题所在:github.com/augustogoncalves/…
  • 您的测试用例中没有上传到 Box.com?这部分代码将整个源文件读入内存。
  • 是的,BOX片是个例外,还是要修。但是第二部分使用了 PIPE,并且由于内存而失败了...
  • 尝试添加错误处理程序,也许有导致问题的潜在错误。但我不明白为什么该代码会将整个源文件读入内存。就像我说的,.pipe() 应该防止这种情况发生(尽管 也许 request 本身就是造成它的原因)。

标签: node.js request aws-lambda


【解决方案1】:

需要考虑的两件事:

  1. 请勿将 request(source).pipe(request(destination)) 与 Promise 一起使用或在 Promise 中使用(异步/等待)。由于某种原因,它在完成承诺时会发生内存泄漏。

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

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

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

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

highWaterMark 背景来源: “因为 Duplex 和 Transform 流都是可读和可写的,它们各自维护两个独立的内部缓冲区,用于读取和写入,允许每一方独立于另一方操作,同时保持适当和高效的数据流。例如,net.Socket 实例是双工流,其可读端允许使用从套接字接收的数据,而其可写端允许将数据写入套接字。因为数据写入套接字的速度可能比接收数据的速度快或慢,所以对每一端都很重要独立于对方操作(和缓冲)。”

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

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

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

let th = newthrottle.Throttle({rate: 10240000}); //如果您不想以超过 10mb/秒的速度传输数据

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

【讨论】:

    猜你喜欢
    • 2011-07-10
    • 2011-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-25
    相关资源
    最近更新 更多