今天,AWS宣布支持Streaming Responses from Lambda Functions。期待已久的功能可帮助开发人员将其功能从其功能流向用户,而无需等待整个响应完成。它对于现代JavaScript框架通常使用的服务器端渲染特别有用。
让我们潜入。
启用
要启用流响应,开发人员将必须稍微修改其功能代码。您的处理程序将需要在节点14、16或18的lambda运行时使用新的装饰符,以包装您的处理程序。
以下是发布帖子的示例:
exports.handler = awslambda.streamifyResponse(
async (event, responseStream, context) => {
responseStream.setContentType(“text/plain”);
responseStream.write(“Hello, world!”);
responseStream.end();
}
);
如果您熟悉Node的writable stream API,那么您会认识到该装饰器实现了一个。 AWS建议您使用流管线写入流 - 再次,这是启动文章的示例:
const pipeline = require("util").promisify(require("stream").pipeline);
const zlib = require('zlib');
const { Readable } = require('stream');
exports.gzip = 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, zlib.createGzip(), responseStream);
});
除了服务器端HTML渲染之类的东西外,此功能还有助于将媒体传输回API呼叫者。这是使用响应流的lambda函数呈现图像的示例:
/**
* Response streaming function which loads a large image.
*/
const image = awslambda.streamifyResponse(
async (event, responseStream, _context) => {
responseStream.setContentType("image/jpeg");
let result = fs.createReadStream('large-photo.jpeg');
await pipeline(result, responseStream);
}
);
称这些功能
接下来,如果您要使用Nodejs AWS SDK调用函数,该函数以编程方式发出流响应,则需要使用V3。我已经written about this change extensively,但最重要的是对于此功能 - 似乎根本没有支持V2 SDK。因此,您需要升级,然后才能利用流媒体响应。如果您想使用其他语言的流响应调用功能,那么现在也支持使用AWS SDK用于Java 2.x,而GO版本1和版本2的AWS SDK则希望Python的Boto3支持即将到来很快。
但是等等,一个捕获
最后,开发人员只能与较新的lambda函数URL集成一起使用此功能。功能URL是通过HTTP请求触发Lambda函数的几种方法之一,我介绍了previously, in another post。在身份验证机制方面,这将有点限制,但最重要的是,它使开发人员能够流式响应大于AWS Lambda提供的前6MB限制。
我的看法
如果您使用lambda服务媒体,例如图像,视频或音频 - 流响应将极大地帮助。对我个人而言,这不是核心用例,但我怀疑这将是使用Lambda使用服务器端渲染服务前端应用程序的开发人员最大程度地利用的。对于这些用户,我认为此发布尤其令人兴奋。
最终,Lambda的流响应是使Lambda的能力更接近用户在其他传统的服务器符合的计算环境中获得的重要步骤。这是一个令人兴奋的新功能,我期待看到它为用户解锁的功能。