如何使用 lambda Java SDK 从 SQS 读取所有消息,聚合所有这些消息并将它们作为单个 JSON 文件存储到 S3 存储桶?

How to read all the messages from a SQS ,aggregate all those msgs and store them as a single JSON file to S3 bucket, using lambda Java SDK?

我正在尝试使用 lambda Java SDK 从 SQS 读取所有消息,聚合所有这些消息并将它们作为单个 JSON 文件存储到 S3 存储桶?

我的实现涉及以下步骤

  1. 创建标准 SQS 并向该 SQS 发送 500 条消息

  2. 编写一个 lambda 使用 while 循环读取来自该 SQS 的所有消息(直到消息计数变为零)

  3. 在读取来自该 SQS 的所有消息后,现在此 lambda 必须将所有接收到的消息聚合到一个 ArrayList 中,并将该数组列表转换为单个 JSON 文件并存储它JSON S3 存储桶中的文件

现在我卡在了第 3 步,因为 AWS 在读取 SQS 消息时跨越了多个 lambda 实例,因此我无法在一个 ArrayList 中聚合接收到的消息,我应该使用 Dynamo DB 来聚合所有消息并且创建单个 JSON 文件并存储在 S3 存储桶中?

请提出解决此问题的方法

谢谢, 桑达尔

将 Lambda 函数中的 ReservedConcurrentExecutions 属性设置为 1,从而避免启动多个实例。

您的用例更适合 Kinesis Stream

流本质上是一个队列,但有一些重要的区别,主要是在您的场景中,这些区别是 Lambda 可以从 Kinesis 获取的批处理大小上限为 10000 个事件或 6mb,而不是像 SQS 中那样的 10 个事件。您可以简单地创建一个包含 1 个分片的 Kinesis 流,这意味着只有 1 个 Lambda 是 运行 并且它将同步读取数据。如果你这样做,那么你就不必小批量地从 SQS 读取,也不必担心多个 Lambda 实例

一些有用的参考:Using Lambda with Kinesis as an event source