全部產品
Search
文件中心

:訊息優先順序為1,就一定優先嗎?

更新時間:Sep 03, 2024

本文介紹設定訊息優先順序和訊息消費順序的關係。

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不能保證按照訊息的發送順序去消費訊息,所以如果業務必須先進先出,建議在訊息中加入序號資訊以便消費訊息後進行重新排序。

如果您要求訊息順序必須先進先出,需要在應用程式層面解決,請參見嚴格保序隊列