如何将 Nest.js SSE 与 AWS Lambda 结合使用?

问题描述 投票:0回答:1

我测试了使用 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 问题。

node.js amazon-web-services aws-lambda nest
1个回答
0
投票

这可以使用 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,而只使用 ECS/EC2 来处理这个问题。

© www.soinside.com 2019 - 2024. All rights reserved.