hot*_*oup 5 java amazon-sqs amazon-web-services aws-lambda
这里的 Java 8 使用 AWS Java SDK 编写一个 Java lambda,该 lambda 应该执行以响应发送到 SQS 队列的消息。
理想情况下,对于发送到 SQS 队列的每条记录,将调用/执行唯一一个 lambda 实例。因此,如果将 5 条消息发送到队列,则将触发 5 个 lambda(或者 - 取决于我的 lambda 配置 - 我可以设置并发 lambda 的最大数量,在这种情况下,我的期望是待处理/未使用的 SQS 消息将等待下一个可用的消息拉姆达)。
这不是硬性要求,只是理想的要求。
我注意到课堂上com.amazonaws.services.lambda.runtime.events.SqsEvent有一个getRecords() : List<SQSMessage>方法让我有点担心。对我来说,这意味着单个 lambda 实例每次执行可能会收到超过 1 条 SQS 消息,这又违背了我期望的行为。
因此,我想知道是否有一种方法可以配置 Lambda 触发器,使其只为每个 SQS 队列消息触发一次,并且还遵循“并发 Lambda 实例的最大数量”设置,使消息在 SQS 中等待,直到 Lambda 被触发。准备好。再举一个例子,假设我将并发 Lambda 的最大数量设置为三 (3),并且有 5 条消息同时发送到队列中。在这种情况下,我希望触发 3 个 Lambda,每个 Lambda 处理 5 条排队消息中的一条,并且 5 条消息中的 2 条将等待这 3 个 Lambda 之一完成,以便另一个 Lambda 可以触发并接收它们。
这可以吗?或者 Lambda 是否只是以某种方式自行“决定”(?)向给定的 Lambda 执行提交多少条消息?如果是这样,有人知道这是如何决定的吗?
正如 @joseph 已经正确指出的那样,您可以使用BatchSize设置为 1 的事件源映射。这将使最多返回 1 SQSMessage。为了一次最多处理 1 条消息,您必须将 Lambda 函数的保留并发度设置为 1。但是,正如也正确指出的那样,这对于标准SQS 队列来说并不是最佳选择。事件源映射将遇到一些TooManyRequestsException: Rate Exceeded错误,这些错误会记录到 CloudWatch Logs 中。getRecords()
要使用正确的一次一条消息顺序处理模式而不依赖 Lambda 函数限制,请使用 SQS FIFO 队列,如 AWS 博客文章 [1] 中所述。它表示:“总并发数等于或小于 SQS FIFO 队列中唯一 MessageGroupId 的数量”。也就是说,您可以为 SQS FIFO 队列配置一个MessageGroupId,以便:
因此,唯一消息组 ID 的数量是最大的。SQS FIFO 队列的事件源映射的并发 Lambda 调用数。
据我所知,AWS 提供了一组 POJO(例如SQSEvent在库aws-lambda-java-events中)[2],以便处理传入的 SQS 事件 [3]。SQS 事件由 Lambda 事件源映射传递并反序列化到给定的 POJO 中。POJO SQSEvent的文档也可以在 JavaDoc.io [4] 上找到,源代码可以在 GitHub [5] 上找到。该方法getRecords()返回对象列表SQSMessage,因为 AWS Lambda 事件源映射确实可以提供 1 到 10 条 SQS 消息。
事件源映射是使用特定于源类型的属性创建和配置的。当我们考虑 SQS 集成时,我们必须仅考虑 SQS 特定的属性。主要是:BatchSize和EventSourceArn。完整列表请参见 [6]。如果属性不适用于 SQS 源类型,则其描述以关键字 开头(Streams)。
如果要限制使用 检索的 SQS 消息的数量,则必须设置BatchSizegetRecords()。默认值为 10。
如文档 [7] 中所述,Lambda 并发限制可用于限制 Lambda 函数同时处理的 SQS 消息批次的数量。但是,这不会阻止事件源映射调用 Lambda 函数。至少,我找不到任何相反的官方消息来源——如果我错了,请纠正我。
也就是说,如果大量使用 SQS 队列,则会抛出大量限制错误(代码 429)。可以通过指示事件源按顺序处理消息来克服此问题。这是通过使用 Amazon SQS FIFO 事件源来实现的。这是一个相当新的功能。[8]
总而言之,我建议:
[1] https://aws.amazon.com/blogs/compute/new-for-aws-lambda-sqs-fifo-as-an-event-source/
[2] https://docs.aws.amazon。 com/lambda/latest/dg/with-sqs-create-package.html#with-sqs-example-deployment-pkg-java
[3] https://docs.aws.amazon.com/lambda/latest/dg/ with-sqs.html
[4] https://javadoc.io/static/com.amazonaws/aws-lambda-java-events/2.2.2/com/amazonaws/services/lambda/runtime/events/SQSEvent.html
[ 5] https://github.com/aws/aws-lambda-java-libs/blob/master/aws-lambda-java-events/src/main/java/com/amazonaws/services/lambda/runtime/events/ SQSEvent.java
[6] https://docs.aws.amazon.com/lambda/latest/dg/API_CreateEventSourceMapping.html#API_CreateEventSourceMapping_RequestBody
[7] https://docs.aws.amazon.com/lambda/latest/dg/ configuration-concurrency.html
[8] https://aws.amazon.com/about-aws/whats-new/2019/11/aws-lambda-supports-amazon-sqs-fifo-event-source/?nc1=h_ls
[9] https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_SendMessage.html
[10] https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/using-messagegroupid-property .html
[11] https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/FIFO-queues.html#FIFO-queues-moving
[12] https://aws.amazon.com/sqs/pricing /?nc1=h_ls
| 归档时间: |
|
| 查看次数: |
3885 次 |
| 最近记录: |