我设置了一个如下所示的系统:lambda1 -> SQS -> lambda2
Lambda1 将向 SQS 发送大量消息(全部在几秒钟内)。然后,我设置了 SQS 队列和 lambda2 之间的事件源映射,使其 MaximumBatchingWindowInSeconds
为 180 秒,BatchSize
为 500。鉴于此设置,我d 只期望 lambda2 被触发一次(在 180 秒内从 lambda1 发送最多 500 条消息)。但是观察到的行为(基于 lambda2 的 cloudwatch 日志数量)似乎是每条消息一个触发器(传递给处理程序的 SQSEvent 仅包含一条记录)。不过,180 秒的 MaximumBatchingWindowInSeconds
似乎有效。另一个细节是lambda2的超时时间也是180秒。关于这里可能发生的事情有什么想法吗?
MyQueue:
Type: AWS::SQS::Queue
Properties:
QueueName: MyQueueName
ReceiveMessageWaitTimeSeconds: 10
VisibilityTimeout: 180
LambdaFunctionEventSourceMapping:
Type: AWS::Lambda::EventSourceMapping
Properties:
BatchSize: 500
Enabled: true
EventSourceArn: !GetAtt MyQueue.Arn
FunctionName: !GetAtt MyLambdaFunction.Arn
MaximumBatchingWindowInSeconds: 180
编辑:
lambda1 使用 sdk 向 SQS 发送消息:sqsClient.sendMessage(sendSQSMessageRequest);
lambda2 通过 handleRequest 函数接收 SQSEvents:
public Boolean handleRequest(final SQSEvent sqsEvent, final Context 上下文)
最佳答案
根据 https://docs.aws.amazon.com/lambda/latest/dg/with-sqs.html
只要事件的总大小不超过同步调用的负载限制 (6 MB),Lambda 就会在一次调用中将批处理中的所有记录传递给函数。
有效负载大小可能是影响因素之一。
关于java - Lambda 在每个 SQS 消息上触发,尽管 Lambda 事件源映射中的批处理大小为 500,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65348579/