为什么我的 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=0
和 WaitTimeSeconds=0
- 消息将超时并在 0 秒后再次可见。
这可能不是您想要的 - 您应该在此处尝试使用更高的值并阅读有关它们的文档:https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-visibility-timeout.html
您可以暂停通常的处理时间并将值设置为安全值,以便在出现错误时传递消息。
关于 SQS 的要点:
- 可见性超时
- 等待时间秒
- 收货句柄
当 Lambda 函数接收到一条消息时,它会为该接收得到一个 'ReceiptHandle'。
现在,只要新的 lambda 线程收到使先前处理程序无效的消息,此 ReceiveHandle
就会更改。
由于 VisibilityTimeout = 0
和 WaitTimeSeconds = 0
,(正如@Mandraenke 所指出的),该消息立即可用于另一个具有新 'ReceiptHandle'.[=13= 的 lambda 线程]
前一个 lambda 线程正在处理的收据 'ReceiptHandle' 变得无效,无法被处理它的 lambda 函数访问。
我有一个 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=0
和 WaitTimeSeconds=0
- 消息将超时并在 0 秒后再次可见。
这可能不是您想要的 - 您应该在此处尝试使用更高的值并阅读有关它们的文档:https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-visibility-timeout.html
您可以暂停通常的处理时间并将值设置为安全值,以便在出现错误时传递消息。
关于 SQS 的要点:
- 可见性超时
- 等待时间秒
- 收货句柄
当 Lambda 函数接收到一条消息时,它会为该接收得到一个 'ReceiptHandle'。
现在,只要新的 lambda 线程收到使先前处理程序无效的消息,此 ReceiveHandle
就会更改。
由于 VisibilityTimeout = 0
和 WaitTimeSeconds = 0
,(正如@Mandraenke 所指出的),该消息立即可用于另一个具有新 'ReceiptHandle'.[=13= 的 lambda 线程]
前一个 lambda 线程正在处理的收据 'ReceiptHandle' 变得无效,无法被处理它的 lambda 函数访问。