在AWS SQS Fifo队列中,当批量大小设置为1时,可见性超时(visibility timeout)的时间不起作用,会在每次接收一条消息后自动重置。这可能导致同一条消息在多个消费者之间重复处理。为了避免这种情况,可以通过在消费者端手动删除消息来避免自动重置可见性超时时间。下面代码示例中演示了如何在Python中使用boto3处理AWS SQS Fifo队列中的消息,并手动删除消息。
示例代码:
import boto3
sqs = boto3.client('sqs')
queue_url = 'https://sqs.us-west-2.amazonaws.com/123456789012/my-queue.fifo'
response = sqs.receive_message(
QueueUrl=queue_url,
AttributeNames=['SentTimestamp'],
MaxNumberOfMessages=1,
MessageAttributeNames=['All'],
VisibilityTimeout=0,
WaitTimeSeconds=0
)
message = response['Messages'][0]
receipt_handle = message['ReceiptHandle']
# 手动处理消息
# todo: 在此处添加自己的消息处理代码
# ...
# 删除已处理的消息
sqs.delete_message(
QueueUrl=queue_url,
ReceiptHandle=receipt_handle
)
注意:在AWS SQS Fifo队列中,如果一个消息被处理了但没有被删除,它会在可见性超时时间结束后重新出现,因此建议在处理完成后立即删除消息。