本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
配置 Lambda 函数以流式处理响应
配置 Lambda 函数 URL 以将响应负载流式传输回客户端。响应流式处理可通过提高首字节时间(TTFB)性能,使延迟敏感型应用程序受益。这是因为您可以在部分响应可用时将其发送回客户端。此外,您可以使用响应流式处理来构建返回较大负载的函数。响应流负载的软限制为 20MB,而缓冲响应的软限制为 6MB。流式处理响应还意味着您的函数不需要在内存中容纳整个响应。对于非常大的响应,这样可以减少您需要为函数配置的内存量。
Lambda 流式处理您的响应的速度取决于响应大小。函数响应的前 6MB 的流式处理速率无上限。对于大于 6MB 的响应,响应的其余部分受带宽上限的限制。有关流式处理带宽的详细信息,请参阅响应流式处理的带宽限制。
流式处理响应会产生费用。有关更多信息,请参阅Amazon Lambda 定价
Lambda 在 Node.js 托管式运行时系统上支持响应流式处理。对于其他语言,您也可以使用带有自定义运行时系统 API 集成的自定义运行时系统来流式处理响应或使用 Lambda Web Adapter
注意
通过 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 的调用模式(控制台)
-
打开 Lamba 控制台的函数页面
。 -
选择您要为其设置调用模式的函数的名称。
-
选择 Configuration(配置)选项卡,然后选择 Function URL(函数 URL)。
-
选择编辑,然后选择其他设置。
-
在调用模式下,选择所需的调用模式。
-
选择保存。
设置函数 URL 的调用模式(Amazon CLI)
aws lambda update-function-url-config --function-name
my-function
--invoke-mode RESPONSE_STREAM
设置函数 URL 的调用模式(Amazon CloudFormation)
MyFunctionUrl: Type: AWS::Lambda::Url Properties: AuthType: AWS_IAM InvokeMode: RESPONSE_STREAM
有关配置函数 URL 的更多信息,请参阅 Lambda 函数 URL。
响应流式处理的带宽限制
您的函数响应负载的前 6MB 的带宽无上限。在此初始突增之后,Lambda 会以最大 2MBps 的速率流式处理您的响应。如果您的函数响应从未超出 6MB,则此带宽限制永远不适用。
注意
带宽限制仅适用于您的函数的响应负载,不适用于您的函数的网络访问。
无上限带宽的速率因多种因素而异,其中包括函数的处理速度。通常,函数响应的前 6MB 的速率高于 2MBps。如果您的函数将响应流式处理到 Amazon 以外的目标,则流式处理速率还取决于外部互联网连接的速度。