我需要一些帮助来了解我在这里缺少的内容。
我正在使用 SQS FIFO 队列,其可见性超时设置为 2 分钟,并且带有 lambda 触发器。现在我正在运行一个超级简单的代码,它只发送 4 条消息,然后触发器上设置的 lambda 读取队列并删除消息。这是它的一些代码:
def lambda_handler(event, context):
print('event: ', event)
sqs = boto3.client('sqs')
queue_url = "https://sqs..."
response = sqs.receive_message(QueueUrl=queue_url, MaxNumberOfMessages=1)
new_receipt_handle = event['Records'][0]['receiptHandle']
print(new_receipt_handle)
sqs.delete_message(QueueUrl=queue_url, ReceiptHandle=new_receipt_handle)
return {
'statusCode': 200,
'body': 'Executions processed successfully'
}
在我的用例中,我希望在给定时间最多运行两个 lambda,并且我期望在正在运行的 lambda 处理消息并将其删除后执行一个新的 lambda。为了实现这一点,我在 lambda 配置中将批量大小设置为 1,将最大并发度设置为 2。
但是当我将 4 条消息排入队列时,我看到的行为是:两条消息正确执行(我看到了 cloudwatch 日志),其他消息保持在“飞行中”状态,直到可见性超时结束,并且然后它们被执行并删除。我期待后两条消息在第一条消息被删除时运行,而不是等待可见性超时。
知道为什么会发生这种情况吗?设置此类队列的正确方法是什么,一次仅处理两条消息,队列中的新消息在被删除后立即开始处理。
当将 Lambda 与 Amazon SQS 结合使用 - AWS Lambda 时,AWS Lambda 服务负责:
event
参数将其传递给 Lambda 函数您在 Lambda 函数中编写的代码不应直接调用 SQS 队列。事实上,它不需要任何 SQS 权限。
您的代码应该执行此操作来检索消息:
def lambda_handler(event, context):
for record in event['Records']:
body = record['body']
# Do something with body