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

2024-05-14 16:43:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个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
    )

Tags: keyclientawsurlmessageaccessqueueresponse
3条回答

关于SQS需要了解的要点:

  1. 可见性超时
  2. 等待时间秒
  3. 收据手柄

当Lambda函数接收到消息时,它将获得该接收的“ReceiptHandle”。 现在,每当一个新的lambda线程收到使前一个处理程序无效的消息时,这个ReceiveHandle就会改变

由于VisibilityTimeout = 0WaitTimeSeconds = 0,(正如@Mandraenke所指出的那样),消息会立即提供给另一个具有新“ReceiptHandle”的lambda线程

前一个lambda线程正在处理的收据“ReceiptHandle”无效,处理它的lambda函数无法访问该收据

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

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

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

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

相关问题 更多 >

    热门问题