delete_message_batch 并没有真正从 SQS 队列中删除消息

luc*_*fer 5 python messaging amazon-sqs boto3

我正在使用标准的 Amazon SQS 队列。在python3中使用boto3库与SQS交互。以下是我接收消息然后删除它们的代码:

from boto3.session import Session
boto3_session = Session(region_name=SQS_REGION_NAME, aws_access_key_id=SQS_ACCESS_ID,
                                aws_secret_access_key=SQS_ACCESS_KEY)
sqs = boto3_session.client('sqs')

response = sqs.receive_message(
    MessageAttributeNames=[
        'EventToReport',
    ],
    QueueUrl=queue_url,
    MaxNumberOfMessages=10,
    VisibilityTimeout=0,
    WaitTimeSeconds=0
)
messages = response['Messages']
receipt_handles = [{'Id': str(index), 'ReceiptHandle': msg['ReceiptHandle']} for index, msg in enumerate(messages)]
sqs.delete_message_batch(QueueUrl=queue_url, Entries=receipt_handles)
Run Code Online (Sandbox Code Playgroud)

这将返回一个成功响应:

{'Successful': [{'Id': '0'}, {'Id': '1'}, {'Id': '2'}, {'Id': '3'}, {'Id': '4'}, {'Id': '5'}, {'Id': '6'}, {'Id': '7'}, {'Id': '8'}, {'Id': '9'}], 'ResponseMetadata': {'RequestId': 'bb28855b-6522-5a1e-a649-d7b3fdabfebe', 'RetryAttempts': 0, 'HTTPStatusCode': 200, 'HTTPHeaders': {'content-length': '1008', 'connection': 'keep-alive', 'server': 'Server', 'date': 'Mon, 29 Jan 2018 03:34:33 GMT', 'content-type': 'text/xml', 'x-amzn-requestid': 'bb28855b-6522-5a1e-a649-d7b3fdabfebe'}}}
Run Code Online (Sandbox Code Playgroud)

但是当我查看我的 SQS 管理控制台时,我可以看到没有任何消息被删除!消息的可见性超时为 30 秒。

我将队列的可见性超时增加到 30 分钟,尽管响应相同,但现在只有 1 条消息被删除!

我知道完成删除需要时间,所以我每次都等了 2-3 分钟,但消息仍保留在队列中......我是否以错误的方式调用 API?据我所知,这是使用 boto3 调用 sqs api 的正确方法。

luc*_*fer 5

我终于发现我的代码有问题。虽然我在 sqs 控制台中描述了可见性超时,但我的 get 请求覆盖了它,所以我只是从代码中删除了以下两行receive_message

VisibilityTimeout=0,
WaitTimeSeconds=0
Run Code Online (Sandbox Code Playgroud)

现在工作正常。