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 接收一条消息。
我正在寻找使用 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 接收一条消息。