本文介绍设置消息优先级和消息消费顺序的关系。

消息服务MNS发送消息时,可以指定消息的优先级权值(取值范围1~16,1为最高优先级,默认优先级为8)。优先级越高的消息,越容易更早被消费。

如果顺序发送100条消息,第50条消息的优先级置为1(其余消息优先级默认为8)。

CloudQueue queue = createQueue();
     for(int i=1;i<=100;i++){
         Message message = new Message();
             if(i==50){
                 message.setPriority(1);
             }
             message.setMessageBody("msg-"+i, Message.MessageBodyType.RAW_STRING);
             Message putMsg = queue.putMessage(message);
             System.out.println("PutMessage MsgId: " + putMsg.getMessageId());
      }

实际上消费者取出来的消息不是全局有序的,而且第50条消息也不是第一个被消费的。

消息服务MNS的消息优先级不是全局的,而是局部的。 您可以理解为消息存放在多个通道中,称为“切片”。优先级只会在同一个切片中才有意义。如果取的第一个切片中有高优先级的消息,那么消息服务MNS会优先返回;如果取的第一个切片中没有高优先级的消息,消息服务MNS也会先返回这个切片中的数据。所以消息服务MNS可以支持很高的QPS,但是不保证消息顺序。

消息服务MNS消费消息时尽量做到先进先出,因为消息队列的分布式特性,消息服务MNS不能保证按照消息的发送顺序去消费消息,所以如果业务必须先进先出,建议在消息中加入序号信息以便消费消息后进行重新排序。

如果您要求消息顺序必须先进先出,需要在应用层面解决,请参见严格保序队列