問題
Message Service を介してメッセージを送信する際には、メッセージの優先度を指定できます。(値の範囲は 1 から 16 で、”1” が最も高い優先度です。デフォルトの優先度は “8” です。) 優先度の高いメッセージほど、先に取得される可能性が高まります。
優先度が 1 のメッセージは、確実に優先度 2 のメッセージよりも先に取得されるのでしょうか。
回答
優先度が 1 のメッセージは必ず最初に取得するとは限りません。テストは下記となります。
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()+”,priority=”+ putMsg.getPriority());
}
このテストの結果を見ると、メッセージは全体的として順番どおりに呼び出されているわけでもなければ、50 番のメッセージが最初に取得されているわけでもありませんでした。
原因
Message Service はメッセージができるだけ FIFO 方式で取得されるように試みます。ただし、分散メッセージキューの性質上、必ずしも送信された順番どおりにメッセージを取得できるとは限りません。FIFO を必要とするサービスでは、取得した後で並べ替えられるようにメッセージに連番を追加することをお勧めします。
Message Service におけるメッセージの優先度は、グローバルではなく部分的なものです。
次のように考えるとよいでしょう。メッセージは複数のチャネルに格納され、同じチャネルに格納されたメッセージは “スライス” と呼ばれます。優先度の設定は、同じスライスに格納されているメッセージの間でのみ有効になります。
第 1 のスライスに高い優先度のメッセージが含まれている場合、Message Service はこのスライスのメッセージを最初に返します。しかし、第 1 のスライスに高い優先度のメッセージが含まれていないのに、Message Service がこのスライスのメッセージを最初に返すこともあります。
これが、Message Service が高 QPS をサポートしながら、メッセージの取得順が一定でない理由の 1 つです。
他にご質問がありましたら、テクニカルサポートにお問い合わせください。