AWS Lambda 推出响应负载流

301 阅读3分钟

亚马逊最近宣布,AWS Lambda函数可以逐步将响应有效载荷流回客户端。这项新功能提高了网络和移动应用程序的性能,目前可用于Node.js 14.x和更新的运行时,以及自定义的运行时。

响应流可以帮助开发者从他们的功能中向用户流式传输响应,而不一定要等待整个响应的完成。使用Lambda函数的URL和SDK支持这一期待已久的功能,但目前无法使用API网关或应用负载平衡器(ALB)来流化响应有效载荷。首席开发者倡导者Julian Wood 解释了其中的优势:

在传统的请求-响应模型中,响应在返回给客户端之前需要完全生成和缓冲。当客户端等待响应生成时,这可能会延迟第一个字节的时间(TTFB)性能。网络应用对TTFB和页面加载性能特别敏感。

为图像、视频、大型文档或数据库结果等大型有效载荷而设计的响应流需要用streamifyResponse() 装饰器来包装Lambda函数处理程序,例如:

exports.handler = awslambda.streamifyResponse(
	async (event, responseStream, context) => {
    	responseStream.setContentType("text/plain");
    	responseStream.write("Hello, world!");
    	responseStream.end();
	}
);

其中新的responseStream对象提供了一个流对象,该函数可以将数据写入其中并立即发送给客户端。开发者可以选择性地设置响应的Content-Type头,以传递关于流的额外信息。Datadog的工程团队负责人AJ Stuyvenberg 测试了这个新功能并发表了评论:

这次推出的功能看起来不大,但它释放了几个关键的用例--特别是对于希望在利用服务器端渲染的同时缩短第一个字节的时间的Next.js和React开发者来说。

新功能目前支持的最大响应大小为20MB(软限制),流式功能的最大带宽吞吐量限制为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在Serverless Patterns Collection中发布了Lambda流式应用实例,这些应用支持AWS SAM来构建和部署资源。流式响应增加了Lambda的网络传输成本,但AWS免费层现在包括每月100GiB的HTTP响应流,超过了每个请求的前6MB。