收到的SQS消息无序

use*_*268 4 amazon-sqs amazon-web-services

我在python中使用boto3客户端.我正在将消息推送到sqs但是以错误的顺序接收它们.我可以看出他们的发送时间是正确的.

队列创建如下:

boto_session = boto3.Session(region_name=..,aws_access_key_id=..,                                      aws_secret_access_key=...)
sqs_client = boto_session.resource('sqs', endpoint_url=endpoint_url)
sqs_client.create_queue(QueueName=...)
Run Code Online (Sandbox Code Playgroud)

推送消息的代码:

boto_session = boto3.Session(region_name=..,aws_access_key_id=..,aws_secret_access_key=...)
sqs_client = boto_session.resource('sqs', endpoint_url=endpoint_url)
queue = sqs_client.get_queue_by_name(QueueName=stream_name)

i = 0
while i < 10:
    print 'b ' + str(i)
    queue.send_message(MessageBody=raw_data.push(json.dumps(dict(id=i)))
    sleep(2)
    i += 1
Run Code Online (Sandbox Code Playgroud)

和轮询消息的代码:

sqs_resource = boto_session.resource('sqs', endpoint_url=endpoint_url)
queue = sqs_resource.get_queue_by_name(QueueName=queue_name)

while True:
   messages = queue.receive_messages(MaxNumberOfMessages=1,VisibilityTimeout=10,WaitTimeSeconds=5)
   for m in messages:
         print  m.data
         queue.delete_messages(
                Entries=[
                    {
                        'Id': m.message_id,
                        'ReceiptHandle': m.receipt_handle
                    }
                ]
            )
Run Code Online (Sandbox Code Playgroud)

我运行了创建队列代码,然后我推送了消息,然后运行了一个进程来使用消息,如图所示.

我清楚地看到消息是随机排序的.

在sqs中有解决方案吗?或者我应该更换队列?

tdd*_*key 6

SQS不保证消息的排序.最好以接受此代码的方式编写代码,或者切换到排队系统,如果您绝对需要它,它进行排序.

文档位于此处,相关段落为:

如果我希望按顺序传递消息怎么办?Amazon SQS尽最大努力保留邮件中的订单,但由于队列的分布式特性,我们无法保证您将按照发送邮件的确切顺序接收邮件.您通常会在邮件中放置排序信息或时间戳,以便在收到邮件时重新排序.