提问人:Can Balkaya 提问时间:11/9/2023 最后编辑:lalliCan Balkaya 更新时间:11/9/2023 访问量:56
如何将 Nest.js SSE 与 AWS Lambda 结合使用?
How to use Nest.js SSE with AWS Lambda?
问:
我测试了我的端点,它使用 Nest 的 SSE,它在我的本地机器上成功了。
将我的 Nest.js 应用程序部署到 AWS Lambda 后,我看到终端节点在无服务器上不起作用。
我发现了来自 AWS Lambda 的响应流,但没有找到任何适合我的情况的解决方案。
您知道如何使用 Nest.js 在 AWS Lambda 上运行流函数吗?
async sendMessage(dto: ChatDto): Promise\<Observable\<{ data: string }\>\> {
const configuration = {
apiKey: process.env.OPENAI_API_KEY
}
const openai = new OpenAI(configuration)
return new Observable((subscriber) => {
(async () => {
try {
const responseStream = await openai.chat.completions.create({
model: dto.model,
messages: dto.messages as any,
stream: true,
})
for await (const chunk of responseStream) {
const response = chunk.choices[0].delta.content;
subscriber.next({ data: response })
}
subscriber.complete()
} catch (error) {
subscriber.error(error)
}
})()
})
}
@UseGuards(JwtGuard, ApiKeyGuard)
@Post("conversation")
@Sse()
sendMessage(@Body() dto: ChatDto) {
return this.service.sendMessage(dto)
}
我需要使用 Nest.js 修复我的 AWS Lambda 问题。
答:
0赞
Leonardo Gazdek
11/9/2023
#1
这可以使用 AWS Lambda 响应流式传输来实现。您可以编写自己的 Lambda 处理程序(它仅适用于 Lambda,而不适用于其他任何地方),我还没有找到任何人让它以“NestJS 方式”工作。
下面是响应流 lambda 处理程序的示例:
exports.handler = awslambda.streamifyResponse(
async (event, responseStream, context) => {
responseStream.setContentType("text/event-stream");
responseStream.write("event: test\n");
responseStream.write('data: {"key": "value"}');
responseStream.write('\n\n');
responseStream.end();
}
);
SSE 只是一个 MIME 类型为 text/event-stream 的响应流。命名事件的格式为:
event: firstEvent
data: {...}
event: secondEvent
data: {...}
...
为了使您的 SSE NestJS 控制器正常工作,需要有人创建一个适配器库 - 我还没有找到一个可以处理 NestJS SSE 实现的适配器库。也许你刚刚给了我一个主意。
目前,最好的选择可能是将应用程序的该部分分离到其自己的 Lambda 函数/处理程序中,而不是在 NestJS 中处理它。
请记住,实际上,无服务器确实不适用于此类用例,您可能会遇到比预期更多的麻烦。我真的建议在这个使用案例中远离 Lambda,只使用 ECS/EC2 来处理这个问题,这样可以节省一些时间和麻烦。
评论