仅在收集到固定数量的数据后才执行 AWS Lambda(具有多个数据)

Perform AWS Lambda (with multiple data) only after a fixed amount of data is gathered

我想执行一个包含多个数据的 lambda 函数,只有在收集到固定数量的数据后。例如,固定数量将仅考虑特定数量的消息,或在特定时间范围内发送的消息。

我想使用 SQS 来解决这个问题,我在上面写消息,并使用轮询来检查 SQS 状态。但我不喜欢这个解决方案,因为我想在条件匹配时立即触发 lambda(例如:从发送第一条消息起经过的时间,或固定数量的消息)

理想的情况是发送所有收集到的消息,例如,在第一条消息到达后 1 分钟后发送。

要明确:

  1. 第一条消息到达队列
  2. 从现在开始计时(例如 1 分钟)
  3. 计时器结束,它将触发 lambda 并收集到现在为止的所有消息

此外,我想根据不同的 id 并行处理不同的队列

有什么优雅的方法吗?

我已经建立了一个使用顺序 lambda 的系统,它处理每条消息的所有进程

您可以通过几种方式做到这一点。我会这样做:

  1. 让队列成为 lambda 函数的事件源
  2. lambda 函数可以:触发状态机或不做任何事情。如果当前没有触发状态机(意味着我们在 1 分钟范围内),它会触发状态机。

状态机有以下步骤:

  1. 1 分钟等待
  2. 是否正在处理

不幸的是,这在 AWS Lambda 上不是一件容易的事(我们有类似的用例)。

SQS 或 Kinesis 数据流作为触发器可能会有帮助,但有一些限制:

  • SQS会被AWS Lambda以非常高的频率拉取。您必须为 lambda 添加并发限制,以使其被多个项目触发。并且最大批量大小仅为 10。

  • base rate for Kinesis trigger每个分片每秒1个,不可更改

在不同的调用之间聚合记录不是一个好主意,因为您永远不知道下一次调用是否会在不同的容器上启动,因此它们会丢失。

Kinesis Firehose 很有用,因为您可以配置最大批处理大小和发送新批处理的最大时间范围。您可以将其配置为写入 S3 存储桶并将 lambda 配置为由新创建的文件触发。

确保如果您使用 Kinesis 数据流作为 Kinesis firehose 的源,来自数据流的每个分片的数据在 Firehose 中单独批处理(这是 不是 记录在 AWS 中)。