RabbitMQ 消費預取數量的優(yōu)化

場景

在使用RabbitMQ時,默認預取消息隊列中的全部數據緩存在本地崇堵,導致只有一個進程能獲取資源型诚,而其他進程處于閑置狀態(tài)。而持有資源的進程消費能力有限時鸳劳,會導致消息隊列積壓俺驶。

說明

消息的輪詢分配機制和盡可能快速推送消息的機制給實際使用帶來困難。實際情況下棍辕,每個消費者處理消息的能力暮现、每個消息處理所需時間可能都是不同的,若只是機械化地順次分配楚昭,可能造成一個消費者由于處理的消息的業(yè)務復雜栖袋、處理能力低而積壓消息,另一個消費者早早處理完所有的消息抚太,處于空閑狀態(tài)塘幅,造成系統(tǒng)的處理能力的浪費。且無法加入新的消費者以提高系統(tǒng)的處理能力尿贫。

希望達到的效果是:每個消費者都根據自身處理能力合理分配消息處理任務电媳,既無擠壓也無空閑,新加入的消費者也能分擔消息處理任務庆亡,使系統(tǒng)的處理能力能夠平行擴展匾乓。

RabbitMQ客戶端可通過Channel類的basicQos(int prefetchCount)設置消費者的預取數目,即消費者最大的未確認消息的數目又谋。

假設prefetchCount=10拼缝,有兩個消費者,兩個消費者依次從隊列中抓取10條消息緩存本地彰亥,若此時有新的消息到達隊列咧七,先判斷信道中未確認的消息是否大于或等于20條,若是任斋,則不向信道中投遞消息继阻,當信道中未確認消息數小于20條后,信道中哪個消費者未確認消息小于10條,就將消息投遞給哪個消費者瘟檩。

channel.basicQos()中設置的預取數量多少合適犬第,是一個頗有講究的問題。我們希望充分利用消費者的處理能力芒帕,因此不宜設置過小歉嗓,否則在消費者處理消息后,RabbitMQ收到確認消息后才會投遞新的消息背蟆,導致此期間消費者處于空閑狀態(tài)鉴分,浪費消費者的處理能力;但設置過大带膀,又可能使消息積壓在消費者的緩存里志珍,我們希望對于來不及處理的消息,應保留在隊列中垛叨,便于加入新的消費者或空閑出來的消費者分擔消息處理任務伦糯。
? RabbitMQ官網的一篇文章詳細討論了預取數量的設置問題:
? https://www.rabbitmq.com/blog/2012/05/11/some-queuing-theory-throughput-latency-and-bandwidth/

文章大致內容如下:

假設從RabbitMQ服務端隊列取消息、傳輸消息到消費者耗時為50ms嗽元,消費者消費消息耗時4ms敛纲,消費者傳輸確認消息到服務端耗時為50ms。若網絡狀況剂癌、消費者處理速度穩(wěn)定淤翔,則預取數量的最優(yōu)數值為:(50 + 4 + 50)/4=26個。

image.png

最初服務端將向客戶端發(fā)送26條消息佩谷,并緩存在客戶端本地旁壮,當消費者處理好第一個消息后,向服務端發(fā)送確認消息并取本地緩存的第二個消息谐檀,確認消息由客戶端傳送到服務端耗時50ms抡谐,服務端收到確認后發(fā)送新的消息經過50ms又到達了客戶端,而余下的25個消息被消費耗時為25×4=100ms桐猬,所以當新的消息達到時麦撵,第一輪的26個消息恰好全部處理完。依次類推课幕,之后厦坛,每當處理完一個舊有的消息時五垮,恰好會到達一個新的消息乍惊。既不會發(fā)生消息積壓,消費者也不會空閑放仗。
? 但實際情況是润绎,網絡的傳輸狀況、消費者處理消息的速度都不會是恒定的,會時快時慢莉撇,造成消息積壓或消費者空閑呢蛤,這就要求預取數量要與網絡和消費者的狀況實時改變。

總結

說白了棍郎,預取數據就是為了控制消費者在獲取/發(fā)送數據與業(yè)務邏輯之間能夠更好的銜接其障,避免某個消息積壓或過于空閑的情況出現。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末涂佃,一起剝皮案震驚了整個濱河市励翼,隨后出現的幾起案子,更是在濱河造成了極大的恐慌辜荠,老刑警劉巖汽抚,帶你破解...
    沈念sama閱讀 216,692評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件伯病,死亡現場離奇詭異造烁,居然都是意外死亡,警方通過查閱死者的電腦和手機午笛,發(fā)現死者居然都...
    沈念sama閱讀 92,482評論 3 392
  • 文/潘曉璐 我一進店門惭蟋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人药磺,你說我怎么就攤上這事敞葛。” “怎么了与涡?”我有些...
    開封第一講書人閱讀 162,995評論 0 353
  • 文/不壞的土叔 我叫張陵惹谐,是天一觀的道長。 經常有香客問我驼卖,道長氨肌,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,223評論 1 292
  • 正文 為了忘掉前任酌畜,我火速辦了婚禮怎囚,結果婚禮上,老公的妹妹穿的比我還像新娘桥胞。我一直安慰自己恳守,他們只是感情好,可當我...
    茶點故事閱讀 67,245評論 6 388
  • 文/花漫 我一把揭開白布贩虾。 她就那樣靜靜地躺著催烘,像睡著了一般。 火紅的嫁衣襯著肌膚如雪缎罢。 梳的紋絲不亂的頭發(fā)上伊群,一...
    開封第一講書人閱讀 51,208評論 1 299
  • 那天考杉,我揣著相機與錄音,去河邊找鬼舰始。 笑死崇棠,一個胖子當著我的面吹牛,可吹牛的內容都是我干的丸卷。 我是一名探鬼主播枕稀,決...
    沈念sama閱讀 40,091評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼谜嫉!你這毒婦竟也來了抽莱?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,929評論 0 274
  • 序言:老撾萬榮一對情侶失蹤骄恶,失蹤者是張志新(化名)和其女友劉穎食铐,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體僧鲁,經...
    沈念sama閱讀 45,346評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡虐呻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,570評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了寞秃。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片斟叼。...
    茶點故事閱讀 39,739評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖春寿,靈堂內的尸體忽然破棺而出朗涩,到底是詐尸還是另有隱情,我是刑警寧澤绑改,帶...
    沈念sama閱讀 35,437評論 5 344
  • 正文 年R本政府宣布谢床,位于F島的核電站,受9級特大地震影響厘线,放射性物質發(fā)生泄漏识腿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,037評論 3 326
  • 文/蒙蒙 一造壮、第九天 我趴在偏房一處隱蔽的房頂上張望渡讼。 院中可真熱鬧,春花似錦耳璧、人聲如沸成箫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蹬昌。三九已至,卻和暖如春召廷,著一層夾襖步出監(jiān)牢的瞬間凳厢,已是汗流浹背账胧。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評論 1 269
  • 我被黑心中介騙來泰國打工竞慢, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留先紫,地道東北人。 一個月前我還...
    沈念sama閱讀 47,760評論 2 369
  • 正文 我出身青樓筹煮,卻偏偏與公主長得像遮精,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子败潦,可洞房花燭夜當晚...
    茶點故事閱讀 44,647評論 2 354

推薦閱讀更多精彩內容