AWS SQS / Lambda -> 处理数据一次 1 条记录,消息发送或同步之间存在延迟

AWS SQS / Lambda -> Process Data 1 Record At a Time with Delay Between Message Sent or Synchronously

我正在寻找使用 SQS(或任何其他 AWS 服务)执行以下操作的解决方案:

用例二:如果我有 X(每秒 1-10 条消息)从 lambda 函数发送到 SQS 队列的消息。我想从 SQS 队列同步地将消息一对一地发送到另一个 lambda 函数。例如,我的 lambda 函数将消息发送到 SQS 队列;它每 0.1 秒发送 1 条消息。所以每秒 10 条消息。我希望我的 SQS 队列一次将数据 1 条消息发送到我的目标函数进行处理,并且仅在前一条消息处理完成后才发送下一条消息。所以在这种情况下,消息一会被立即处理,第二条消息会在队列中等待,直到第一条消息完成,一旦完成,第二条消息就会被发送,依此类推。

用例二:如果我有 X(每秒 1-10 条消息)从 lambda 函数发送到 SQS 队列的消息。我想从 SQS 队列将消息 1-by-1 发送到另一个 lambda 函数,每条消息发送之间都有延迟。例如,消息一被发送到我的目的地,3 秒后消息二被发送,三秒后消息三被发送,等等。我在这里选择 3 秒,因为这是我的目标进程到 运行.

TL;DR 我需要一种方法,一次只从队列发送一条记录;每条消息之间有 3 秒的延迟,或者直到上一条消息完成处理。

到目前为止我做了什么?

我认为创建一个延迟 3 秒的 FIFO 队列可以解决这个问题?

  GSSAREventQueue:
    Type: AWS::SQS::Queue
    Properties: 
      ContentBasedDeduplication: false
      DeduplicationScope: messageGroup
      FifoThroughputLimit: perMessageGroupId 
      DelaySeconds: 3
      FifoQueue: true
      ReceiveMessageWaitTimeSeconds: 3
      RedrivePolicy:
        deadLetterTargetArn: !GetAtt MyDeadLetterQueue.Arn
        maxReceiveCount: 10

  MyDeadLetterQueue: 
    Type: AWS::SQS::Queue
    Properties: 
      FifoQueue: true
 

但是当我查看数据发送到的 lambda 的日志时:

2021-09-30T14:49:28.816+01:00   END RequestId: 5f9e784c-bba1-56f5-84e7-2183793ac607

2021-09-30T14:49:28.816+01:00   REPORT RequestId: 5f9e784c-bba1-56f5-84e7-2183793ac607 Duration: 217.39 ms Billed Duration: 218 ms Memory Size: 128 MB Max Memory Used: 101 MB XRAY TraceId: 1-6155c068-6565d6de237fd0170fb290d0 SegmentId: 11f9660438a56763 Sampled: true

2021-09-30T14:49:30.808+01:00 开始 RequestId:7d98c954-47c6-5b7f-8665-909b855be17b 版本:$LATEST

几乎没有延迟。我确保在我的 Lambda

上分批发送数据 1
      Events:
        UserEvent:
          Type: SQS
          Properties:
            BatchSize: 1
            Queue: !GetAtt GSSAREventQueue.Arn

我这里可能做错了什么;我的用例可行吗?

我认为可能发生的事情:

SQS 在每批消息之间以 3 秒的延迟发送数据?也许它一次发送 10 条消息,并且因为我在 lambda 上设置了 BatchSize: 1,它一次通过 1 发送数据?

--

需要这个的主要原因是我 reading/writing 来自 DynamoDB 中同一记录的数据 Table;如果 lambda 同时收到 10 条消息,而 10 个 lambda 分别处理,数字就会出错。

您可以使用lambda 的保留并发特性。 https://docs.aws.amazon.com/lambda/latest/dg/configuration-concurrency.html

您可以将目标 lambda 的预留并发值设置为 1,将批量大小设置为 1。这将确保一次只有一个目标 lambda 实例 运行 并且一次会从 SQS 接收一条消息。