本文介紹設定訊息優先順序和訊息消費順序的關係。
Message ServiceMNS發送訊息時,可以指定訊息的優先順序權值(取值範圍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條訊息也不是第一個被消費的。
Message ServiceMNS的訊息優先順序不是全域的,而是局部的。 您可以理解為訊息存放在多個通道中,稱為“切片”。優先順序只會在同一個切片中才有意義。如果取的第一個切片中有高優先順序的訊息,那麼Message ServiceMNS會優先返回;如果取的第一個切片中沒有高優先順序的訊息,Message ServiceMNS也會先返回這個切片中的資料。所以Message ServiceMNS可以支援很高的QPS,但是不保證訊息順序。
Message ServiceMNS消費訊息時盡量做到先進先出,因為訊息佇列的分布式特性,Message ServiceMNS不能保證按照訊息的發送順序去消費訊息,所以如果業務必須先進先出,建議在訊息中加入序號資訊以便消費訊息後進行重新排序。
如果您要求訊息順序必須先進先出,需要在應用程式層面解決,請參見嚴格保序隊列。