SQS“飞行中”状态的消息:未正确删除

问题描述 投票:0回答:1

我需要一些帮助来了解我在这里缺少的内容。

我正在使用 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 日志),其他消息保持在“飞行中”状态,直到可见性超时结束,并且然后它们被执行并删除。我期待后两条消息在第一条消息被删除时运行,而不是等待可见性超时。

知道为什么会发生这种情况吗?设置此类队列的正确方法是什么,一次仅处理两条消息,队列中的新消息在被删除后立即开始处理。

amazon-web-services aws-lambda amazon-sqs
1个回答
0
投票

将 Lambda 与 Amazon SQS 结合使用 - AWS Lambda 时,AWS Lambda 服务负责:

  • 从 Amazon SQS 队列检索消息并通过
    event
    参数将其传递给 Lambda 函数
  • Lambda 函数运行完毕后删除消息(如果函数成功完成)

您在 Lambda 函数中编写的代码不应直接调用 SQS 队列。事实上,它不需要任何 SQS 权限。

您的代码应该执行此操作来检索消息:

def lambda_handler(event, context):

  for record in event['Records']:
    body = record['body']
    # Do something with body
© www.soinside.com 2019 - 2024. All rights reserved.