【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
119會員
268內容數
哈囉,我是阿Han,是一位 👩‍💻 軟體研發工程師,喜歡閱讀、學習、撰寫文章及教學,擅長以圖代文,化繁為簡,除了幫助自己釐清思路之外,也希望藉由圖解的方式幫助大家共同學習,甚至手把手帶您設計出高品質的軟體產品。
留言0
查看全部
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
大家好,我是woody,是一名料理創作者,非常努力地在嘗試將複雜的料理簡單化,讓大家也可以體驗到料理的樂趣而我也非常享受料理的過程,今天想跟大家聊聊,除了料理本身,料理創作背後的成本。
Thumbnail
哈囉~很久沒跟各位自我介紹一下了~ 大家好~我是爺恩 我是一名圖文插畫家,有追蹤我一段時間的應該有發現爺恩這個品牌經營了好像.....快五年了(汗)時間過得真快!隨著時間過去,創作這件事好像變得更忙碌了,也很開心跟很多厲害的創作者以及廠商互相合作幫忙,還有最重要的是大家的支持與陪伴🥹。  
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
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
因爲如果以自己想說的順序為主,就變成你自己是主角,對方只是在聽你說,所以打完招呼後,聊聊最近發生的事,一邊找對方想說的事,直到對方自己開心的說起來時,就表示問對了。 接下來就是順著對方回應,等對方說夠了,會開始接受你額外的問題,這時你再問你想問的問題。 提問順序的重要性 進行聊天的藝術,不
Thumbnail
調整你的優先順序, 在你的世界裡,練習照顧自己,為自身的幸福與快樂,需要與期待負起責任, 在別人的世界裡,尊重對方的界線,選擇與決定。
Thumbnail
大家好,我是woody,是一名料理創作者,非常努力地在嘗試將複雜的料理簡單化,讓大家也可以體驗到料理的樂趣而我也非常享受料理的過程,今天想跟大家聊聊,除了料理本身,料理創作背後的成本。
Thumbnail
哈囉~很久沒跟各位自我介紹一下了~ 大家好~我是爺恩 我是一名圖文插畫家,有追蹤我一段時間的應該有發現爺恩這個品牌經營了好像.....快五年了(汗)時間過得真快!隨著時間過去,創作這件事好像變得更忙碌了,也很開心跟很多厲害的創作者以及廠商互相合作幫忙,還有最重要的是大家的支持與陪伴🥹。  
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
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
因爲如果以自己想說的順序為主,就變成你自己是主角,對方只是在聽你說,所以打完招呼後,聊聊最近發生的事,一邊找對方想說的事,直到對方自己開心的說起來時,就表示問對了。 接下來就是順著對方回應,等對方說夠了,會開始接受你額外的問題,這時你再問你想問的問題。 提問順序的重要性 進行聊天的藝術,不
Thumbnail
調整你的優先順序, 在你的世界裡,練習照顧自己,為自身的幸福與快樂,需要與期待負起責任, 在別人的世界裡,尊重對方的界線,選擇與決定。