场景是这样的:当我的进程启动时,我向 SQS 中的队列发送大约 3k 条消息。从那里我有一个 lambda,我想选择其中 500 条消息并处理它们,然后获取接下来的 500 条消息,依此类推,直到队列为空。由于处理消息的 lambda 必须与非常慢的 API 通信,因此我无法使用并发 lambda 执行,否则我将达到该 API 的限制。 我看到的问题是,有时 lambda 开始选择 500 条消息,但在下一次执行中选择的消息少于 200 条,而下一次执行时它选择的消息甚至更少,依此类推,而不是每次都选择 500 条消息。 也许我误解了设置中的某些内容。我怎样才能实现这种行为? 这些是我的设置:
Lambda:
ProcessMessages:
Type: AWS::Serverless::Function
Properties:
Timeout: 600
CodeUri: process_messages/
Role: !Sub ${ConsumerLambdaRole.Arn}
Handler: app.lambda_handler
Runtime: python3.8
ReservedConcurrentExecutions: 1
Architectures:
- x86_64
Queue:
ProcessMessagesQueue:
Type: AWS::SQS::Queue
Properties:
QueueName: 'processMessages'
DelaySeconds: 0
VisibilityTimeout: 900
RedrivePolicy:
deadLetterTargetArn: !GetAtt DLmessages.Arn
maxReceiveCount: 10
EventSource:
SendMessageToLambda:
Type: AWS::Lambda::EventSourceMapping
Properties:
BatchSize: 500
Enabled: true
EventSourceArn: !GetAtt ProcessMessagesQueue.Arn
FunctionName: !GetAtt ProcessMessages.Arn
FunctionResponseTypes:
- "ReportBatchItemFailures"
MaximumBatchingWindowInSeconds: 20
是的,这就是 AWS Lambda 和 Amazon SQS 的行为。无法保证 Lambda 将从 SQS 队列接收最大数量的消息。
无法改变此行为。