我有一个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
)
关于SQS需要了解的要点:
当Lambda函数接收到消息时,它将获得该接收的“ReceiptHandle”。 现在,每当一个新的lambda线程收到使前一个处理程序无效的消息时,这个
ReceiveHandle
就会改变由于
VisibilityTimeout = 0
和WaitTimeSeconds = 0
,(正如@Mandraenke所指出的那样),消息会立即提供给另一个具有新“ReceiptHandle”的lambda线程前一个lambda线程正在处理的收据“ReceiptHandle”无效,处理它的lambda函数无法访问该收据
可能是因为您正在使用
VisibilityTimeout=0
。这意味着消息立即返回到SQS队列。所以你没有什么可以删除的您正在设置
VisibilityTimeout=0
和WaitTimeSeconds=0
-消息将超时,并在零秒后再次可见这可能不是您想要的-您应该在此处尝试使用更高的值,并阅读有关它们的文档:https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-visibility-timeout.html
您可以超时通常的处理时间,并将值设置为安全值,以便在出现错误时传递消息
相关问题 更多 >
编程相关推荐