我们有 SQS --> aws lambda --> 步骤函数设置。对于队列中的每条消息,lambda 都会被触发,最终开始执行步骤函数。
目前对于每条消息,lambda 都会触发阶跃函数,我们想要控制这种限制。有没有一种方法可以一次只处理一条消息,一旦处理完成,那么只有 lambda 应该轮询新消息并调用步骤函数。
我们将批处理项设置为 1,将批处理窗口设置为 30 秒。 lambda aws 的保留并发设置为 1。通过此配置,还可以观察到多个消息的并行步骤函数执行。
您的模式将 Lambda 限制为一个并发执行,但这并不将您的 Step Function 限制为一个并发执行。为什么不?因为 StartExecution API 是异步的。正如 @MarkB 所说,您的 Lambda 启动 SM 执行并退出,无需等待其完成。上一个函数调用已经退出,即使 SM 执行可能仍在运行,Lambda 也可以启动另一个函数调用。
那么如何限制 Step Function 呢?
关键是使用 ListExecutions API 检查正在进行的执行,并过滤
RUNNING
状态。如果响应的 executions
数组的长度为 0,则可以开始新的执行。
将此逻辑添加到您的 Lambda,仅在没有正在运行的执行时调用
StartExecution
。否则,通过抛出错误将消息返回到队列。