【问题标题】:Processing AWS multiple SQS messages with one Lambda Function使用一个 Lambda 函数处理 AWS 多条 SQS 消息
【发布时间】:2021-10-03 04:27:54
【问题描述】:

我已经设置了一个 SQS 队列,只要有文件上传,就会在其中推送 S3 路径。

所以我有一个设置,我将收到 10 个小 csv 文件,我想将它们保存在 SQS 队列中,并且仅在所有文件在特定时间(比如 5 分钟)到达时触发 lambda。

这是我的 CF 代码

  LambdaFunctionEventSourceMapping:
    Type: AWS::Lambda::EventSourceMapping
    Properties:
      BatchSize: 5000
      MaximumBatchingWindowInSeconds: 300
      Enabled: true
      EventSourceArn: !GetAtt EventQueue.Arn
      FunctionName: !GetAtt QueueConsumerLambdaFunction.Arn

  EventQueue:
    Type: AWS::SQS::Queue
    Properties:
      QueueName: Event-Queue
      DelaySeconds: 10
      VisibilityTimeout: 125
      ReceiveMessageWaitTimeSeconds: 10

  QueueConsumerLambdaFunction:
    Type: AWS::Lambda::Function
    Properties:
      FunctionName: queue-consumer
      Runtime: python3.7
      Code: ./queue-consumer
      Handler: main.lambda_handler
      Role: !GetAtt QueueConsumerLambdaExecutionRole.Arn
      Timeout: 120
      MemorySize: 512
      ReservedConcurrentExecutions: 1

部署工作正常,但如果我将 3 个文件推送到 S3 存储桶,SQS 会异步触发 3 个不同的 lambda 函数,这是我不想要的。我需要一个 lambda 函数来包含由于 S3 事件而导致的队列中的所有消息并处理它们。我的 SQS 配置有问题吗?

【问题讨论】:

  • 您是否将 lambda 并发设置为 1?
  • @Marcin 是的,我做到了。实际上,SQS 的行为很奇怪。有时它会触发 3 个 lambda 函数,每个 lambda 有 3 条不同的消息。有时它会触发 2 个 lambda 函数,其中 1 个 lambda 有 2 条消息,另一个 lambda 有一条消息。
  • and trigger the lambda only once when all the files have arrived 不,这不是 SQS 和 Lambda 的工作方式。是的,您可以批量接收消息,但您无法控制哪个批次和哪些消息。如果您需要这样的分组,您可以使用 DynamoDB 来识别和触发特定更新的 lambda。 (您也可以使用 Kinesis Analytics,但恕我直言,这太过分了)
  • 进展如何?仍然不清楚发生了什么?
  • 感谢您的帮助和回答。实际上,我正在使用您和@gusto2(两者)的建议来使用 dynamoDB 和预定事件,即更易于实现。我正在使用 S3 通知来触发将记录写入 dynamoDB 的 lambda。然后在每个小时之后,我安排一个触发 lambda 并处理我的所有文件的事件,然后在处理后截断表格,以便其他新通知不会重复或重叠。

标签: amazon-web-services amazon-s3 aws-lambda message-queue amazon-sqs


【解决方案1】:

您所观察到的可能是由于 AWS 正在使用 five parallel threads 来查询您的 SQS 队列。这些线程与concurrency 设置是分开的,您无法控制这些线程。总是有 5 个。

所以每个线程都会从队列中获取一些消息,然后你的函数将被这些消息依次调用。遗憾的是,您无法更改它的工作方式,因为这就是 AWS 端 sqs 和 lambda 的工作方式。

【讨论】:

  • 那么我认为这个解决方案可能不适合我。您能否为我的用例提出更好的解决方案? IE。将 S3 事件保持特定时间,然后触发 lambda 一次处理所有这些 S3 文件
  • @muazfaiz 您也许仍然可以使用 lambda,但不要在 sqs 和 lambda 之间设置自动事件。让 lambda 按计划每 5 分钟运行一次,并在 lambda 函数中自己查询队列?
猜你喜欢
  • 1970-01-01
  • 2018-08-03
  • 1970-01-01
  • 2021-10-26
  • 1970-01-01
  • 2022-11-10
  • 1970-01-01
  • 2016-09-01
  • 1970-01-01
相关资源
最近更新 更多