【Message Queue - RabbitMQ】訊息的如何插隊?(Priority)

更新於 發佈於 閱讀時間約 7 分鐘
雖然我們的一般的狀況下我們都希望訊息能夠按照順序被處理, 但有時候我們仍希望某些重要的訊息能夠優先被處理,也就是插隊的概念,正好RabbitMQ也有提供這樣需求的解決方案,以下是需要知道的幾個重點。
  • 宣告Queue的時候必須要設定 x-max-priority, 通常10就夠用了。
  • 數字越大優先序越高。
  • 一般不要設定太大,因為這算是特殊狀況,正常狀況下應該照順序來處理。
  • 沒有指定優先序的訊息會預設為0。
  • 生產端發送的訊息優先序若超過配置的最大值,則會以最大值做為優先序的標示。

配置範例

這邊會以管理界面作為範例, 其他配置方式則大同小異, 可以參考官方文件。
  • 首先進到管理界面的Queues,並加入新的Queue,並配置優先序最大號碼為20。
  • 參數的欄位填上: x-max-priority:20 。
  • 型態記得要選number。
  • 配置完我們的Queue會有Pri的標記。
  • 接著我們將Queue綁定到交換機上。

開始進行實驗

  • 實驗方向:依照訊息重要程度分為1~20個號碼, 雖然我們先送出一個19號的訊息,再送出20號的訊息,但正確堆積在佇列的訊息應該要確保20號的訊息優先於19號。
  • Producer端會送出1、5、3、20的訊息。
(async () => {
const conn = require("amqplib").connect(
"amqp://test:test@127.0.0.1:5672/test"
);
const channel = await (await conn).createChannel();
const priorityNums = [1, 5, 3, 20];
const routingKey = "priority";
const exchange = "qa_exchange_direct";
for (let i = 0; i < priorityNums.length; i++) {
const priority = priorityNums[i];
const msg = `Priority_${priority}`;
channel.publish(exchange, routingKey, Buffer.from(msg), {
priority,
});
console.log(`Send Message: ${msg}`)
}
})();Send Message: Priority_1
Send Message: Priority_5
Send Message: Priority_3
Send Message: Priority_20
  • Comsumer端則會依照優先序接收20、5、3、1的訊息
(async() => {
const conn = require('amqplib').connect('amqp://inuqa:inuqa@127.0.0.1:5672/inuqa');
const channel = await (await conn).createChannel();
await channel.prefetch(1); // 最多能消費unacked的數量
channel.consume("優先序隊列", (msg) => {
setTimeout(() => {
console.log(msg.content.toString());
channel.ack(msg);
}, 1000)
}, {
noAck: false
})
})()Priority_20
Priority_5
Priority_3
Priority_1

注意事項

  • RabbitMQ預設是不支援優先序的, 因為每個隊列的每個優先級都會有一些CPU跟磁碟的開銷成本。
  • 官方建議不要使用Policy的方式來配置, 因為Policy是動態的, 可以在Queue宣告後進行參數的修改, 但優先序隊列在宣告後就無法更改其數量。
  • 假設一開始Queue沒有指定優先序,後續要加上優先序會需要將原本的Queue移除再重新宣告,因此最好一開始規劃功能時就將這一塊給考慮進去!!!!!!!!!!

如何取得訊息中某個優先序號碼剩下的數量?

雖然有了優先序可以幫我們依照訊息的重要程度來分配工作,但就應用面上來看, 我們可能會需要去掌握某個優先序號碼在Queue裡面還剩下幾個未處理, 此時我們可以藉由Management Plugin的API來進行查詢, 查詢方式如下:
<http://$>{ip}/api/queues/${vhost}/${隊列名稱}
// <http://127.0.0.1:8083/api/queues/test/優先序隊列>
GET之後會得到以下的Response, 我們只需要取backing_queue_status.priority_lengths.${優先序號碼}, 就能知道剩餘數量有多少:
{
...,
"backing_queue_status": {
...,
"priority_lengths": {
"0": 0,
"1": 2,
"2": 0,
"3": 2,
"4": 0,
"5": 2,
"6": 0,
"7": 0,
"8": 0,
"9": 0,
"10": 0,
"11": 0,
"12": 0,
"13": 0,
"14": 0,
"15": 0,
"16": 0,
"17": 0,
"18": 0,
"19": 0,
"20": 2
},
...
},
...
}
為什麼會看到廣告
avatar-img
125會員
277內容數
哈囉,我是阿Han,是一位 👩‍💻 軟體研發工程師,喜歡閱讀、學習、撰寫文章及教學,擅長以圖代文,化繁為簡,除了幫助自己釐清思路之外,也希望藉由圖解的方式幫助大家共同學習,甚至手把手帶您設計出高品質的軟體產品。
留言
avatar-img
留言分享你的想法!
阿Han的沙龍 的其他內容
這種方式主要是Consumer處理訊息失敗時, 再把訊息送回去重新排隊, 在RabbitMQ的架構下非常簡單, 只要在Error Handling的地方發送nack訊號回去即可。 這種方式雖然簡單, 但是也存在著一些風險: 由於Queue為了確保順序性, 因此該訊息會被重新排到最前面, 如此一來該訊
在進入Message Queue之前我們先來了解一下同步/非同步任務的概念。 菜單稱為訊息(Message), 為工作內容描述。 送出菜單的客人稱為生產者(Producer), 負責建立訊息。 櫃台就相當於Queue, 負責接單並依序處理。 廚師就是消費者的概念, 負責消化Queue裡面的訊息。 採
軟體世界隨著現實應用越來越複雜,需要處理的資料量也就隨之倍數增長,假設我們每一個動作都要等待處理完畢後再回應,那麼勢必對於廣大用戶的使用者體驗大打折扣,因此這個過程如果有一個中間人幫我們處理掉先來後到的流程,那麼是不是我只要將要進行的動作交給中間人即可,而背後處理的服務商則透過中間人依序處理,處理
這種方式主要是Consumer處理訊息失敗時, 再把訊息送回去重新排隊, 在RabbitMQ的架構下非常簡單, 只要在Error Handling的地方發送nack訊號回去即可。 這種方式雖然簡單, 但是也存在著一些風險: 由於Queue為了確保順序性, 因此該訊息會被重新排到最前面, 如此一來該訊
在進入Message Queue之前我們先來了解一下同步/非同步任務的概念。 菜單稱為訊息(Message), 為工作內容描述。 送出菜單的客人稱為生產者(Producer), 負責建立訊息。 櫃台就相當於Queue, 負責接單並依序處理。 廚師就是消費者的概念, 負責消化Queue裡面的訊息。 採
軟體世界隨著現實應用越來越複雜,需要處理的資料量也就隨之倍數增長,假設我們每一個動作都要等待處理完畢後再回應,那麼勢必對於廣大用戶的使用者體驗大打折扣,因此這個過程如果有一個中間人幫我們處理掉先來後到的流程,那麼是不是我只要將要進行的動作交給中間人即可,而背後處理的服務商則透過中間人依序處理,處理
你可能也想看
Google News 追蹤
Thumbnail
該來的終究還是來了 度過焦躁不安的一整周,學徒老人家我的不安感等比級數的襲來,自3/19寫了第一篇關於<巴克萊銀行:倉促撤退>的報告,看到市場上的機構法人有如大洪水、地震來臨前夕開始竄逃撤退。 海湖莊園協議 接著,在3/31與4/2兩天接著寫了川普與他的財經團隊在海湖莊園豪
Thumbnail
空單爆天量、技術指標超賣、情緒恐慌到極致:美股嘎空行情有機會啟動嗎? 重點摘要: 技術面極度超賣,反彈條件醞釀中,但尚未明確止穩 SPY 與 QQQ 的重要指標,如MACD、KDJ、RSI等指標進入極端超賣區,但尚未出現底部鈍化或明確反轉訊號,技術面仍屬空方主導。 連續出現跳空缺口,空方動
Thumbnail
全新 vocus 挑戰活動「方格人氣王」來啦~四大挑戰任你選,留言 / 愛心 / 瀏覽數大 PK,還有新手專屬挑戰!無論你是 vocus 上活躍創作者或剛加入的新手,都有機會被更多人看見,獲得站上版位曝光&豐富獎勵!🏆
Thumbnail
網頁回應碼是指當網頁伺服器處理完一個請求後所回傳的狀態碼。這篇文章介紹了網頁回應碼的分類,包括1XX、2XX、3XX、4XX和5XX狀態碼,並解釋了各種狀態碼的意義和常見原因。
Thumbnail
如果我很在意說話排序,那一定也有人特別在意做事順序。如果用這個視角去看待別人的話,就不會覺得對方的需求是不重要的。
Thumbnail
題目敘述 Distinct Subsequences 給定一個字串s和目標t,請問有多少個s的子序列可以完美匹配目標t ? 也就是說,有多少個s的子序列和目標t相等? 測試範例 Input: s = "rabbbit", t = "rabbit" Output: 3
Thumbnail
文章中提到了四個問題,包括需求、預算、權限和時間,並提供了設定問題框架的方式。閱讀本文可幫助業務人員提高提問技巧,篩選出潛在成交率高的案子,避免浪費時間。持續追蹤專欄內容,掌握最新的B2B業務實務案例和方法。
Thumbnail
接續上篇篩選機制,本次挑論排序方式跟權重調整方式,00939的權重調整方式分成為兩段式,到底有何功用?追動能的力道,跟低波好嗎?跟00713還有00915的低波篩選機制比較起來如何?另外討論用配息率加權好嗎?這檔ETF的優點跟缺點討論看看,最後用因子來總結。     大綱: 1.
Thumbnail
在Python中,queue是一個非常有用的模块。 它提供了多種佇列(queue)實現,用於在多線程環境中安全地交換信息或者數據。 佇列(queue)是一種先進先出(FIFO)的數據結構,允許在佇列的一端插入元素,另一端取出元素。(FIFO 是First In, First Out 的縮寫)
Thumbnail
前兩篇篩選機制針對篩選指標做完整的討論,這集來針對權重計算來討論,權重計算的目的為何?另外有提到預擬資產管理規模,這個特殊方式似乎沒有在其他的高股息指數上看到,為何有此設計?最後討論此檔指數的優點與缺點,來探討看看。     大綱: 1.稅後淨利與毛利率 2.毛利率 3.區域投
因爲如果以自己想說的順序為主,就變成你自己是主角,對方只是在聽你說,所以打完招呼後,聊聊最近發生的事,一邊找對方想說的事,直到對方自己開心的說起來時,就表示問對了。 接下來就是順著對方回應,等對方說夠了,會開始接受你額外的問題,這時你再問你想問的問題。 提問順序的重要性 進行聊天的藝術,不
Thumbnail
該來的終究還是來了 度過焦躁不安的一整周,學徒老人家我的不安感等比級數的襲來,自3/19寫了第一篇關於<巴克萊銀行:倉促撤退>的報告,看到市場上的機構法人有如大洪水、地震來臨前夕開始竄逃撤退。 海湖莊園協議 接著,在3/31與4/2兩天接著寫了川普與他的財經團隊在海湖莊園豪
Thumbnail
空單爆天量、技術指標超賣、情緒恐慌到極致:美股嘎空行情有機會啟動嗎? 重點摘要: 技術面極度超賣,反彈條件醞釀中,但尚未明確止穩 SPY 與 QQQ 的重要指標,如MACD、KDJ、RSI等指標進入極端超賣區,但尚未出現底部鈍化或明確反轉訊號,技術面仍屬空方主導。 連續出現跳空缺口,空方動
Thumbnail
全新 vocus 挑戰活動「方格人氣王」來啦~四大挑戰任你選,留言 / 愛心 / 瀏覽數大 PK,還有新手專屬挑戰!無論你是 vocus 上活躍創作者或剛加入的新手,都有機會被更多人看見,獲得站上版位曝光&豐富獎勵!🏆
Thumbnail
網頁回應碼是指當網頁伺服器處理完一個請求後所回傳的狀態碼。這篇文章介紹了網頁回應碼的分類,包括1XX、2XX、3XX、4XX和5XX狀態碼,並解釋了各種狀態碼的意義和常見原因。
Thumbnail
如果我很在意說話排序,那一定也有人特別在意做事順序。如果用這個視角去看待別人的話,就不會覺得對方的需求是不重要的。
Thumbnail
題目敘述 Distinct Subsequences 給定一個字串s和目標t,請問有多少個s的子序列可以完美匹配目標t ? 也就是說,有多少個s的子序列和目標t相等? 測試範例 Input: s = "rabbbit", t = "rabbit" Output: 3
Thumbnail
文章中提到了四個問題,包括需求、預算、權限和時間,並提供了設定問題框架的方式。閱讀本文可幫助業務人員提高提問技巧,篩選出潛在成交率高的案子,避免浪費時間。持續追蹤專欄內容,掌握最新的B2B業務實務案例和方法。
Thumbnail
接續上篇篩選機制,本次挑論排序方式跟權重調整方式,00939的權重調整方式分成為兩段式,到底有何功用?追動能的力道,跟低波好嗎?跟00713還有00915的低波篩選機制比較起來如何?另外討論用配息率加權好嗎?這檔ETF的優點跟缺點討論看看,最後用因子來總結。     大綱: 1.
Thumbnail
在Python中,queue是一個非常有用的模块。 它提供了多種佇列(queue)實現,用於在多線程環境中安全地交換信息或者數據。 佇列(queue)是一種先進先出(FIFO)的數據結構,允許在佇列的一端插入元素,另一端取出元素。(FIFO 是First In, First Out 的縮寫)
Thumbnail
前兩篇篩選機制針對篩選指標做完整的討論,這集來針對權重計算來討論,權重計算的目的為何?另外有提到預擬資產管理規模,這個特殊方式似乎沒有在其他的高股息指數上看到,為何有此設計?最後討論此檔指數的優點與缺點,來探討看看。     大綱: 1.稅後淨利與毛利率 2.毛利率 3.區域投
因爲如果以自己想說的順序為主,就變成你自己是主角,對方只是在聽你說,所以打完招呼後,聊聊最近發生的事,一邊找對方想說的事,直到對方自己開心的說起來時,就表示問對了。 接下來就是順著對方回應,等對方說夠了,會開始接受你額外的問題,這時你再問你想問的問題。 提問順序的重要性 進行聊天的藝術,不