java - Lambda 在每个 SQS 消息上触发,尽管 Lambda 事件源映射中的批处理大小为 500

标签 java amazon-web-services aws-lambda amazon-sqs

我设置了一个如下所示的系统: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/

相关文章:

java - 将字符串拆分为第 n 个分隔符

windows - 如何在 EC2 ubuntu flask 应用程序或命令提示符中获取 Windows 登录用户名

amazon-web-services - 如何在cloudformation模板中指定lambda函数和IAM角色名称

python - lambda 单独工作,但在被另一个 lambda 调用时不起作用,尽管 VPN、kms-key 和策略都正确

java - 在另一台计算机上运行 .jar 文件时通信链路失败,但在我的计算机上运行正常

java - Tomcat应用服务器频繁关机

javascript - 如何评估 JSON 的键以匹配特定键并提取该键的值?

amazon-web-services - 打开没有这样的文件或目录

java - 如何读取/写入用冒号 ':' 而不是等于 '=' 分隔键和值的属性文件

amazon-web-services - AWS CloudFormation 错误 : ! 连接对象需要两个参数:(1) 字符串分隔符和 (2) 要连接的字符串列表