为什么我的 AWS SQS 消息没有被删除?

Why do my AWS SQS messages not get deleted?

我有一个 AWS SQS 队列,它接收消息,遍历它们打印详细信息,然后我尝试删除它们。不幸的是,即使我得到成功响应,他们也没有删除。当我确定我以前使用过类似的代码时,我无法弄清楚为什么它们没有被删除。

我正在尝试的基本示例是这样的:

import boto3

# Create SQS client
sqs = boto3.client('sqs',
                    region_name='',
                    aws_access_key_id='',
                    aws_secret_access_key=''
                    )

queue_url = ''

# Receive message from SQS queue
response = sqs.receive_message(
    QueueUrl=queue_url,
    AttributeNames=[
        'All'
    ],
    MaxNumberOfMessages=10,
    MessageAttributeNames=[
        'All'
    ],
    VisibilityTimeout=0,
    WaitTimeSeconds=0
)

print(len(response['Messages']))

for index, message in enumerate(response['Messages']):
    print("Index Number: ", index)
    print(message)

    receipt_handle = message['ReceiptHandle']

    # do some function

    sqs.delete_message(
         QueueUrl=queue_url,
         ReceiptHandle=receipt_handle
    )

可能是因为您正在使用 VisibilityTimeout=0。这意味着消息会立即返回到 SQS 队列。所以没有什么可以给你删除的。

您正在设置 VisibilityTimeout=0WaitTimeSeconds=0 - 消息将超时并在 0 秒后再次可见。

这可能不是您想要的 - 您应该在此处尝试使用更高的值并阅读有关它们的文档:https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-visibility-timeout.html

您可以暂停通常的处理时间并将值设置为安全值,以便在出现错误时传递消息。

关于 SQS 的要点:

  1. 可见性超时
  2. 等待时间秒
  3. 收货句柄

当 Lambda 函数接收到一条消息时,它会为该接收得到一个 'ReceiptHandle'。 现在,只要新的 lambda 线程收到使先前处理程序无效的消息,此 ReceiveHandle 就会更改。

由于 VisibilityTimeout = 0WaitTimeSeconds = 0,(正如@Mandraenke 所指出的),该消息立即可用于另一个具有新 'ReceiptHandle'.[=13= 的 lambda 线程]

前一个 lambda 线程正在处理的收据 'ReceiptHandle' 变得无效,无法被处理它的 lambda 函数访问。