本文介绍设置消息优先级和消息消费顺序的关系。
轻量消息队列(原 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)不能保证按照消息的发送顺序去消费消息,所以如果业务必须先进先出,建议在消息中加入序号信息以便消费消息后进行重新排序。
如果您要求消息顺序必须先进先出,需要在应用层面解决,请参见严格保序队列。
文档内容是否对您有帮助?