AWS SQS无法可靠地触发Lambda

时间:2018-08-21 20:19:47

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

我已经使用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的潜在原因吗?

3 个答案:

答案 0 :(得分:3)

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

您似乎正在使用无服务器框架。请参阅其SQS事件documentation,以设置批量大小。

答案 1 :(得分:1)

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

检查多条消息的事件记录数组。

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

答案 2 :(得分:0)

对于使用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

希望这对某人有帮助-这使我花了很长时间为我的应用程序进行锻炼!