亚马逊最近宣布,AWS Lambda 函数可以逐步将响应负载流式传输回客户端。新功能提高了 Web 和移动应用程序的性能,目前可用于 Node.js 14.x 和更新的运行时,以及自定义运行时。
响应流帮助开发人员将响应从他们的功能流式传输到他们的用户,而不必等待整个响应完成。使用Lambda 函数 URL和 SDK支持期待已久的功能,但目前无法使用 API 网关或应用程序负载均衡器 (ALB) 流式传输响应负载。首席开发倡导者Julian Wood解释了这些优势:
在传统的请求-响应模型中,响应需要在返回给客户端之前完全生成和缓冲。这会在客户端等待生成响应时延迟首字节时间 (TTFB) 性能。Web 应用程序对 TTFB 和页面加载性能特别敏感。
其中新的responseStream对象提供了一个流对象,该函数可以向该对象写入数据并立即将其发送给客户端。开发人员可以选择设置响应的Content-Type标头以传递有关流的附加信息。Datadog 的工程团队负责人AJ Stuyvenberg测试了新功能并发表评论:
此次发布看似微不足道,但它解锁了几个关键用例——尤其是对于希望在利用服务器端渲染的同时缩短首字节时间的 Next.js 和 React 开发人员而言。
新功能目前支持的最大响应大小为 20 MB(软限制),流功能的最大带宽吞吐量限制为 16 Mbps (2 MB/s)。目前,响应流仅在 Node.js SDK 中原生可用,但可以在支持其他编程语言的自定义 Lambda 运行时中实现它。当一些开发人员关注这些限制时,Ampt 的首席执行官兼联合创始人Jeremy Daly在他的时事通讯中写道:
这不仅允许 Lambda 函数逐步将响应流式传输回客户端以减少 TTFB,而且还允许您超过标准的 6MB 负载限制。
云顾问和 AWS 无服务器英雄Yan Cui撰写了一篇文章,演示如何使用新的流式响应返回大型对象,绕过将结果存储在 S3 中的需要。
Lambda 中的响应流并不是云空间中可用的第一个选项,Vercel 最近在 Node.js (Lambda) 和 Edge 运行时提供了对HTTP 响应流的支持。
AWS 在无服务器模式集合中发布了示例 Lambda 流应用程序,这些应用程序支持 AWS SAM 构建和部署资源。流式响应增加了网络传输的Lambda 成本,但 AWS 免费套餐现在包括每月 100GiB 的 HTTP 响应流式传输,超过了每个请求的前 6MB。