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

更新於 2023/04/29閱讀時間約 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
116會員
261內容數
哈囉,我是阿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
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
來到泰國一定要做的一件事絕對是按摩! 這家 Lar thai massage 不在清邁古城,也不在尼曼路,店址位於當地安安靜靜的居民區,雖然沒有高檔大氣的裝修,走的是溫馨家庭式路線。原本我已經連按了好幾天按摩,高檔跟便宜都有,可是肩背還是覺得很僵硬,來這裏按一次整個就鬆了很多。
Thumbnail
"You live for yourselves, not for humans." About trees and their feelings of sadness due to human interference.
Thumbnail
可能包含敏感內容
aurora是一家日式的情色按摩店,比一般的按摩店多出来的服务可能也就数气垫床服务了,妹子脱光了用大胸在你身上来回蹭的感觉,那种软软绵绵的感觉,让你既放松又血脉膨胀,确实是一般按摩效果无法达到的。
Thumbnail
可能包含敏感內容
什么是泰国的Massage?分两种,一种是常规的泰式足疗或者泰式按摩,价格便宜服务号。另一种是Body to Body Massage,也叫B2B Massage,当然,是由漂亮妹子给你全程服务的。价格比中国大陆的一线城市(北上广深杭)便宜多了,服务还更好,一对比下来,在国内找服务
Thumbnail
這篇文章將會講述如何使用程式腳本讀取 Input System 的玩家輸入。
Thumbnail
Ask more, not less, of those you are inviting. Ask more of them than anyone ever has. Remind them who they are and help them become that.
Thumbnail
收到了來自於本日8/10發行ALBUM「Highway X」的B'z的訊息☆ https://bz-vermillion.com/news/220512.html #Bz #HighwayX #LIVEGYM2022 #PresentX **********
Thumbnail
生命之樹想傳達的是一種身心靈保養理念,一種讓能量生生不息的四兩撥千斤,期許著每一位客戶在課程結束之後,身心都能充滿元氣的回到生活中,並且維持更長的舒適感。
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
來到泰國一定要做的一件事絕對是按摩! 這家 Lar thai massage 不在清邁古城,也不在尼曼路,店址位於當地安安靜靜的居民區,雖然沒有高檔大氣的裝修,走的是溫馨家庭式路線。原本我已經連按了好幾天按摩,高檔跟便宜都有,可是肩背還是覺得很僵硬,來這裏按一次整個就鬆了很多。
Thumbnail
"You live for yourselves, not for humans." About trees and their feelings of sadness due to human interference.
Thumbnail
可能包含敏感內容
aurora是一家日式的情色按摩店,比一般的按摩店多出来的服务可能也就数气垫床服务了,妹子脱光了用大胸在你身上来回蹭的感觉,那种软软绵绵的感觉,让你既放松又血脉膨胀,确实是一般按摩效果无法达到的。
Thumbnail
可能包含敏感內容
什么是泰国的Massage?分两种,一种是常规的泰式足疗或者泰式按摩,价格便宜服务号。另一种是Body to Body Massage,也叫B2B Massage,当然,是由漂亮妹子给你全程服务的。价格比中国大陆的一线城市(北上广深杭)便宜多了,服务还更好,一对比下来,在国内找服务
Thumbnail
這篇文章將會講述如何使用程式腳本讀取 Input System 的玩家輸入。
Thumbnail
Ask more, not less, of those you are inviting. Ask more of them than anyone ever has. Remind them who they are and help them become that.
Thumbnail
收到了來自於本日8/10發行ALBUM「Highway X」的B'z的訊息☆ https://bz-vermillion.com/news/220512.html #Bz #HighwayX #LIVEGYM2022 #PresentX **********
Thumbnail
生命之樹想傳達的是一種身心靈保養理念,一種讓能量生生不息的四兩撥千斤,期許著每一位客戶在課程結束之後,身心都能充滿元氣的回到生活中,並且維持更長的舒適感。