1. 程式人生 > 實用技巧 >RabbitMQ筆記-消費者優先順序(x-priority)【轉】

RabbitMQ筆記-消費者優先順序(x-priority)【轉】

概述

消費者優先順序允許你確保高優先順序消費者活動(非阻塞)的時候接收訊息,低優先消費者只有在高優先順序消費者阻塞的時候接收訊息。

通常,連線到佇列上的活動消費者以迴圈的方式從佇列接收訊息。當消費者使用優先順序,如果多個活動消費者存在,且具有相同的優先順序,則訊息輪流傳遞。

活動消費者定義

上述段落指的是消費者處於活動狀態或受阻狀態。在任何時候,給定的消費者不是活動狀態就是阻塞狀態,一個活動的消費者是可以不需要任何等待就接收訊息;一個消費者如果不可以接收訊息就會阻塞,因為它的通道在傳送basic.qos之後已經達到了最大數量的未確認訊息,或者是因為網路阻塞。

對於佇列,以下三種情況肯定有一個為true:

There are no active consumers (佇列沒有活動狀態的消費者)
The queue is empty (佇列為空)
The queue is busy delivering messages to consumers (佇列正在傳送訊息給消費者)
消費者每秒鐘可以在活動和阻塞狀態之間切換多次,我們不會公開消費者是活動或者阻塞通過管理器外掛或者rabbitmqctl。

當消費者使用優先順序時,你期望最高優先順序的消費者接收所有的訊息直到變為阻塞,這時候低優先順序的消費者開始接收一些訊息。如果這裡存在一個活動低優先順序的訊息處於ready狀態,RabbitMQ仍將會按優先順序傳遞訊息,它不會等待一個高優先順序阻塞消費者變為非阻塞消費者。

使用消費者優先順序

設定x-priority引數給basic.consume方法,值是一個整數值。未指定值的消費者預設是0,數字越大優先順序越高,可以使用正數和負數。

Channel channel = ...;
Consumer consumer = ...;
Map<String, Object> args = new HashMap<String, Object>();
args.put("x-priority", 10);
channel.basicConsume("my-queue", false, args, consumer);