我如何支援優先佇列
常見問題 > 使用 Apache ActiveMQ Classic > 我如何支援優先佇列
我如何支援優先佇列?
使用訊息優先權
一個常見的需求是支援優先權消費;因此,高優先權的訊息會在低優先權的訊息之前被消費。
在 5.4 版本中,支援優先佇列。訊息游標和訊息儲存(KahaDB 和 JDBC)都支援訊息優先權。預設情況下,此支援是停用的,因此需要使用 每個目標的策略透過 XML 設定啟用。在下面的範例中,所有佇列都啟用 'prioritizedMessages'。
<destinationPolicy>
<policyMap>
<policyEntries>
<policyEntry queue=">" prioritizedMessages="true"/>
...
JDBC 訊息儲存支援完整的優先權值範圍 (0-9)。對於 KahaDB,支援三種優先權類別:低(< 4)、預設(= 4)和高(> 4)。
由於訊息游標(和客戶端)實作了嚴格的優先權排序,如果訊息分派可以從快取中發生,而不需要存取磁碟(也就是說,您的消費者速度夠快可以跟上生產者),或者如果您使用的是永遠不必刷新到磁碟的非持久性訊息(使用 FilePendingMessageCursor),則可以觀察到嚴格的優先權排序。然而,一旦您遇到消費者速度較慢,或者生產者速度明顯快得多的情況,您會發現快取會填滿(可能包含較低優先權的訊息),而較高優先權的訊息會卡在磁碟上,直到它們被分頁載入才可用。在這種情況下,您可以決定在優化的訊息分派和優先權強制執行之間進行權衡。您可以停用快取、訊息過期檢查,並將您的消費者預取降低到 1,以確保從儲存中取得高優先權的訊息,而不是較低優先權的訊息。請注意,這種權衡可能會對效能產生重大影響,因此您必須徹底測試您的情境。
<destinationPolicy>
<policyMap>
<policyEntries>
<policyEntry queue=">" prioritizedMessages="true" useCache="false" expireMessagesPeriod="0" queuePrefetch="1" />
...
替代策略
使用選擇器
您可以讓 100 個消費者使用選擇器來尋找高優先權的東西
JMSPriority > 6
然後讓 50 個消費者處理平均或以上的優先權
JMSPriority >= 4
然後讓 10 個消費者消費所有訊息(因此是所有優先權)。這樣一來,您就會有一個線程池始終處理高優先權的訊息,從而讓您能夠非常有效率地根據優先權分派訊息,而無需 ActiveMQ Classic 在分派訊息之前將訊息批次處理並重新排序。
使用重新排序器
您可以在某些輸入佇列 A 上重新排序訊息,並以排序順序將它們傳送到佇列 B,以避免必須變更您的客戶端。這避免了像上面顯示的那樣在您的應用程式中使用選擇器的需要。