配置 Lambda 函数以流式处理响应 - AWS Lambda

配置 Lambda 函数以流式处理响应

配置 Lambda 函数 URL 以将响应负载流式传输回客户端。响应流式处理可通过提高首字节时间(TTFB)性能,使延迟敏感型应用程序受益。这是因为您可以在部分响应可用时将其发送回客户端。此外,您可以使用响应流式处理来构建返回较大负载的函数。响应流负载的软限制为 20MB,而缓冲响应的软限制为 6MB。流式处理响应还意味着您的函数不需要在内存中容纳整个响应。对于非常大的响应,这样可以减少您需要为函数配置的内存量。

Lambda 流式处理您的响应的速度取决于响应大小。函数响应的前 6MB 的流式处理速率无上限。对于大于 6MB 的响应,响应的其余部分受带宽上限的限制。有关流式处理带宽的详细信息,请参阅响应流式处理的带宽限制

流式处理响应会产生费用。有关更多信息,请参阅AWS Lambda 定价

Lambda 在 Node.js 托管式运行时系统上支持响应流式处理。对于其他语言,您也可以使用带有自定义运行时系统 API 集成的自定义运行时系统来流式处理响应或使用 Lambda Web Adapter。您可以通过 Lambda 函数网址、AWS软件开发工具包或使用 Lambda API 流式传输响应。InvokeWithResponseStream

注意

通过 Lambda 控制台测试函数时,将始终显示缓冲响应。

编写支持响应流式处理的函数

为响应流式处理函数编写处理程序不同于典型的处理程序模式。编写流式处理函数时,请确保执行以下操作:

  • 使用本机 Node.js 运行时系统提供的 awslambda.streamifyResponse() 装饰器包装函数。

  • 正常结束流,以确保所有数据处理完成。

配置处理程序函数以流式处理响应

要向运行时系统指示 Lambda 应该流式处理函数的响应,您必须使用 streamifyResponse() 装饰器包装函数。从而指示运行时系统使用正确的响应流式处理逻辑路径,同时确保函数能够流式处理响应。

streamifyResponse() 装饰器接受可接受以下参数的函数:

  • event – 提供有关函数 URL 的调用事件的信息,例如 HTTP 方法、查询参数和请求正文。

  • responseStream – 提供可写流。

  • context – 提供的方法和属性包含有关调用、函数和执行环境的信息。

responseStream 对象为 Node.js writableStream。与任何此类流一样,您应该使用 pipeline() 方法。

例 支持响应流式处理的处理程序
const pipeline = require("util").promisify(require("stream").pipeline); const { Readable } = require('stream'); exports.echo = awslambda.streamifyResponse(async (event, responseStream, _context) => { // As an example, convert event to a readable stream. const requestStream = Readable.from(Buffer.from(JSON.stringify(event))); await pipeline(requestStream, responseStream); });

尽管 responseStream 提供了写入流的 write() 方法,但建议您尽可能使用 pipeline()。使用 pipeline() 能够确保可写流不会被速度更快的可读流所淹没。

结束流

确保在处理程序返回之前正确结束流。pipeline() 方法会自动处理此问题。

对于其他使用案例,请调用 responseStream.end() 方法以正确结束流。此方法表示不应向流写入更多数据。如果您使用 pipeline()pipe() 写入流,则不需要使用此方法。

例 使用 pipeline() 结束流的示例
const pipeline = require("util").promisify(require("stream").pipeline); exports.handler = awslambda.streamifyResponse(async (event, responseStream, _context) => { await pipeline(requestStream, responseStream); });
例 不使用 pipeline() 结束流的示例
exports.handler = awslambda.streamifyResponse(async (event, responseStream, _context) => { responseStream.write("Hello "); responseStream.write("world "); responseStream.write("from "); responseStream.write("Lambda!"); responseStream.end(); });

使用 Lambda 函数 URL 调用支持响应流式处理的函数

注意

您必须使用函数 URL 调用函数才能流式处理响应。

您可以通过更改函数 URL 的调用模式来调用支持响应流式处理的函数。调用模式决定 Lambda 使用哪个 API 操作来调用函数。可用的调用模式有:

  • BUFFERED – 这是默认选项。Lambda 通过 Invoke API 操作调用函数。负载完成后,调用结果可用。最大负载大小为 6MB。

  • RESPONSE_STREAM – 使函数能够在负载结果可用时对其进行流式处理。Lambda 通过 InvokeWithResponseStream API 操作调用函数。最大响应负载大小为 20MB。但是,您可以请求提高限额

通过直接调用 Invoke API 操作,您仍然可以在不进行响应流式处理的情况下调用函数。但是,Lambda 会流式处理通过函数 URL 发出的调用的所有响应负载,直到您将调用模式更改为 BUFFERED

设置函数 URL 的调用模式(控制台)
  1. 打开 Lamba 控制台的函数页面

  2. 选择您要为其设置调用模式的函数的名称。

  3. 选择 Configuration(配置)选项卡,然后选择 Function URL(函数 URL)。

  4. 选择编辑,然后选择其他设置

  5. 调用模式下,选择所需的调用模式。

  6. 选择保存

设置函数 URL 的调用模式(AWS CLI)

aws lambda update-function-url-config --function-name my-function --invoke-mode RESPONSE_STREAM

设置函数 URL 的调用模式(AWS CloudFormation)

MyFunctionUrl: Type: AWS::Lambda::Url Properties: AuthType: AWS_IAM InvokeMode: RESPONSE_STREAM

有关配置函数 URL 的更多信息,请参阅 Lambda 函数 URL

响应流式处理的带宽限制

您的函数响应负载的前 6MB 的带宽无上限。在此初始突增之后,Lambda 会以最大 2MBps 的速率流式处理您的响应。如果您的函数响应从未超出 6MB,则此带宽限制永远不适用。

注意

带宽限制仅适用于您的函数的响应负载,不适用于您的函数的网络访问。

无上限带宽的速率因多种因素而异,其中包括函数的处理速度。通常,函数响应的前 6MB 的速率高于 2MBps。如果您的函数将响应流式处理到 AWS 以外的目标,则流式处理速率还取决于外部互联网连接的速度。