当使用FIFO队列时,SQS将在保留原始消息顺序方面提供有限的“最佳努力”。如果消息被发送到Dead-Letter队列(DLQ),该消息的顺序将由发送到DLQ队列的所有消息的顺序决定。因此,如果一个消息在队列上卡住并且被发送到DLQ,它将在DLQ队列中按照原来消息在FIFO队列中的顺序排列。
以下是一个使用Python的代码示例,用于测试这种情况:
import boto3 import json
sqs_client = boto3.client('sqs')
queue_url = 'https://sqs.us-west-2.amazonaws.com/111111111111/test.fifo' dlq_queue_url = 'https://sqs.us-west-2.amazonaws.com/111111111111/test-dlq.fifo'
NUM_OF_MESSAGES = 10
for i in range(NUM_OF_MESSAGES): response = sqs_client.send_message( QueueUrl=queue_url, MessageGroupId='test_group', MessageDeduplicationId=f'test_msg_{i}', MessageBody=f'Test message {i}', ) print('Sent message:', response['MessageId'])
response = sqs_client.receive_message( QueueUrl=queue_url, MaxNumberOfMessages=NUM_OF_MESSAGES, WaitTimeSeconds=3, )
if response['ResponseMetadata']['HTTPStatusCode'] == 200: message = response['Messages'][0] receipt_handle = message['ReceiptHandle'] response = sqs_client.change_message_visibility( QueueUrl=queue_url, ReceiptHandle=receipt_handle, VisibilityTimeout=0, ) print('Simulating a message getting stuck in DLQ:', message['MessageId'])
# Move message to DLQ
response = sqs_client.send_message(
QueueUrl=dlq_queue_url,
MessageGroupId='test_group',
MessageDeduplicationId=message['MessageId'],
MessageBody=message['Body'],
)
print('Moved message to DLQ:', response['MessageId'])
response = sqs_client.receive_message( QueueUrl=dlq_queue_url, MaxNumberOfMessages=NUM_OF_MESSAGES, WaitTimeSeconds=3, )
if response['ResponseMetadata']['HTTPStatusCode'] == 200: print('Received messages from DL