使用 AWS SQS 处理长查询

Using AWS SQS to handle a long query

我有一个 NodeJS 端点,它接收从报告引擎收集数据的请求。 为了保持请求端点的简洁,并且因为生成的一些报告有几个步骤(收集数据 -> assemble 报告 -> 转换为 PDF -> 发送电子邮件给相关人员)我想将入站请求与工作分开本身。

使用 AWS.SQS 我可以接受请求,将变量放入 SQS 并使用 200 / 201 进行响应。

在另一端接手这份工作有哪些更好的做法? 如果我要触发一个 lambda 函数,我是否必须等待该函数完成才能发送 200 / 201?或者我可以:

Accept Request ->
Job to SQS -> 
Initiate Lamba function ->
200 Response.

或者还有哪些其他选项可用于将入站请求与处理本身分离?

这里有几个选项:

  1. 在您的 SQS 队列中插入请求并立即 return 200 响应。在 EC2 服务器上有一个进程轮询 SQS 队列并在从 SQS 中获取消息时执行查询。
  2. 异步调用 Lambda 函数,向其传递执行查询所需的属性,并立即 return 200 响应。由于您异步调用了 Lambda 函数,因此调用 Lambda 函数的 NodeJS 代码不会等待该函数完成。
  3. #2 的替代方法是将请求发送到 SNS 主题,并将 SNS 主题配置为调用 Lambda 函数。如果您使用的是 Lambda,这可能是最好的方法,因为如果 Lambda 函数因某种原因失败,SNS 将重试。

我不建议将 SQS 与 Lambda 结合使用,因为这两种服务不能很好地集成。另一方面,SNS 确实与 Lambda 集成得很好。

此外,您需要确保您的 Lambda 函数调用可以在 5 分钟内完成,因为这是目前 Lambda 函数可以执行的最长时间。如果您需要 运行 的单个步骤超过 5 分钟,您将需要使用 EC2 或 ECS。

我认为 AWS Step Functions 可能很适合您的用例。