【问题标题】:AWS SQS doesn't reliably trigger LambdaAWS SQS 不能可靠地触发 Lambda
【发布时间】:2019-01-28 01:58:11
【问题描述】:

我使用 Lambda 和 SQS 设置了一个小型无服务器应用程序。 在我的例子中,我希望每次消息被添加到SQS队列时触发一个lambda。

我的 serverless.yml 中的函数

functions:
  collectGame:
    handler: js/collect.collectGame
    memorySize: 128
    timeout: 10
    events:
    - sqs:
        arn:
          Fn::GetAtt:
            - gameRequestQueue
            - Arn
    - http:
        method: post
        cors:
          origin: "https://my-api-url.com"
        path: get/game/{id}
        private: true
        request:
          parameters:
            paths:
              id:true

我通过一次向队列发送 31 条消息来测试该过程,但意识到只有 9 个 Lambda 被执行(通过查看 cloudwatch 日志)。我查看了队列,可以确认它已被所有消息填充,并且在 9 个 Lambda 被触发后它是空的。

我希望有 31 次 Lambda 执行,但事实并非如此。有人知道消息未触发我的 Lambda 的潜在原因吗?

【问题讨论】:

  • 您的 lambda 是否被多条消息调用?
  • 您确定 Cloud Watch 中只有 9 个执行而不是 9 个日志组吗?
  • @ArtemArkhipov 我又试了一次,现在我看到总共 8 个日志组中有 11 个调用

标签: amazon-web-services aws-lambda amazon-sqs serverless


【解决方案1】:

您的 lambda 函数可能被多条消息调用。如果您只希望每次 lambda 调用发送一条消息,则应该能够在创建事件源映射时将 BatchSize 设置为 1

看起来您正在使用无服务器框架。请参阅他们的 SQS 事件 documentation 以设置批量大小。

【讨论】:

  • 非常感谢!这正是我遇到的问题。
【解决方案2】:

对于使用 aws sam 的任何人,这里是提到批量大小的链接:here,查找子标题“将队列配置为事件源”。这是我在 yaml 中设置的代码以及 DLQ:

  # add an event trigger in the properties section of your function
  Events:
    MySQSEvent:
      Type: SQS
      Properties:
        Queue: !GetAtt MySqsQueueName.Arn              
        BatchSize: 1

# then define the queue
  MySqsQueueName:
    Type: AWS::SQS::Queue  
    Properties: 
      VisibilityTimeout: 800
      ReceiveMessageWaitTimeSeconds: 10
      DelaySeconds: 10
      RedrivePolicy:
        deadLetterTargetArn: !GetAtt MyDLQueue.Arn
        maxReceiveCount: 2

  # define a dead letter queue to handle bad messages
  MyDLQueue:
    Type: AWS::SQS::Queue  
    Properties: 
      VisibilityTimeout: 900

希望这对某人有所帮助 - 我花了很长时间才开发出我的应用程序!

【讨论】:

    【解决方案3】:

    我也面临着完全相同的问题。问题出在我的 lambda 函数中。 如果批处理大小大于 1,在这种情况下,在单个 lambda 调用中,多个 SQS 消息将传递给 lambda(基于批处理大小),只需处理 lambda 中的所有消息(通过遍历所有消息)。

    检查您的事件记录数组是否有多条消息。

    {Records: [{..},{..},{..}]}
    

    【讨论】:

      猜你喜欢
      • 2020-05-17
      • 1970-01-01
      • 2020-07-28
      • 2021-03-28
      • 1970-01-01
      • 2018-03-01
      • 2020-10-15
      • 2020-02-15
      • 2019-03-26
      相关资源
      最近更新 更多