RabbitMQ 淺析之一次隊(duì)列積壓

文章主要是兩部分,第一部分介紹 RabbitMQ 的基礎(chǔ)信息贸典,網(wǎng)上有很多视卢,如果對 RabbitMQ 比較熟悉可以略過,第二部分主要講述遇到的問題和影響性能的一些因素以及解決辦法廊驼。

第一部分

RabbitMQ 基礎(chǔ)介紹

RabbitMQ 是基于 Erlang 語言實(shí)現(xiàn) AMQP(高級消息隊(duì)列協(xié)議)的消息中間件的一種据过,最初起源于金融系統(tǒng),用于在分布式系統(tǒng)中存儲轉(zhuǎn)發(fā)消息妒挎,在易用性绳锅、擴(kuò)展性、高可用性等方面表現(xiàn)不俗饥漫。

RabbitMQ 主要是為了實(shí)現(xiàn)系統(tǒng)之間的雙向解耦而實(shí)現(xiàn)的榨呆,消息的發(fā)送者無需知道消息使用者的存在,反之亦然庸队。

一些 RabbitMQ 術(shù)語

  • Channel
  • Producer
  • Exchange
  • Queue
  • Consumer

數(shù)據(jù)流

data flow

Channel

客戶端和服務(wù)建立連接积蜻,通過 Channel 向 Exchange 發(fā)送消息,Exchange 通過 Routing Key 將消息路由到 Queue (Exchange 和 Queue 通過 Routing Key 建立綁定關(guān)系彻消,Routing Key 也可以為空)竿拆。

Exchange (交換機(jī))

接收消息且轉(zhuǎn)發(fā)消息到綁定隊(duì)列,Producer 只能將消息發(fā)給 Exchange宾尚,由 Exchange 將消息轉(zhuǎn)發(fā)到綁定的 Queue丙笋,Exchange 常用的幾種類型工作模式谢澈,fanout、direct御板、topic锥忿。

fanout 模式即為廣播模式,Exchange 會(huì)把同一份消息發(fā)送給所有的綁定隊(duì)列怠肋,每一個(gè)隊(duì)列收到的消息是相同的敬鬓。
fanout.png

生產(chǎn)者 P 通過 Exchange X 將消息發(fā)給兩個(gè)隊(duì)列,C1笙各、C2 分別消費(fèi)對應(yīng)的隊(duì)列钉答,他們得到的數(shù)據(jù)是相同的。

direct 模式通過 RoutingKey 將消息發(fā)送給指定的隊(duì)列
direct.png

生產(chǎn)者 P 通過 Exchange X 將 error 消息發(fā)送到 amqp.gen-S9b 隊(duì)列杈抢,將 info数尿、error、warning 消息發(fā)送到 amqp.gen-A1 隊(duì)列惶楼,他們分別對應(yīng)著消費(fèi)者 C1右蹦、C2。

topic 模式按照規(guī)則轉(zhuǎn)發(fā)鲫懒,跟 direct 差不多嫩实,只是但是支持模式匹配,通配符等窥岩,具有更好的靈活性甲献。
topic.png

topic 模式下,會(huì)對 Routing key 做模式匹配颂翼,* 代表匹配一個(gè)單詞晃洒,# 匹配 0 個(gè)或多個(gè),*.orange.* 會(huì)把指定 Routing key 中間是 orange 的全部路由到 Q1 隊(duì)列朦乏,而 lazy.# 會(huì)把是 lazy. 開頭的消息分發(fā)到 Q2 隊(duì)列球及,*.*.rabbit 則代表把前兩個(gè)是任意詞,但是結(jié)尾是 .rabbit 的消息分發(fā)到 Q2 隊(duì)列呻疹。

交換機(jī)的幾個(gè)屬性
  • Durabilty 是否持久化
  • Auto Delete 是否自動(dòng)刪除

Queue(隊(duì)列)

隊(duì)列是通過 RoutingKey 和 Exchange 綁定在一起的吃引,Queue 的消息都來自 Exchange,Producer 是無法直接像隊(duì)列發(fā)送消息的刽锤,一個(gè)隊(duì)列可以和多個(gè) Exchange 綁定在一起镊尺。

Queue 的幾個(gè)屬性

  • Durabilty
  • Auto Delete

第二部分

問題:通過 MQ 監(jiān)控管理后臺發(fā)現(xiàn)隊(duì)列積壓嚴(yán)重,內(nèi)存消耗 6G 多并思。
使用場景:移動(dòng)端上報(bào)日志庐氮,存儲到 RabbitMQ,之后服務(wù)端消耗 MQ 對日志進(jìn)行格式化后再次分發(fā)宋彼。

mq.png

注意上圖中的兩個(gè)紅色框處(當(dāng)時(shí)沒有截圖)弄砍,Consumer utilisation 當(dāng)時(shí)在 7% 左右仙畦,Process memory 大約 6G 多,生產(chǎn)者每秒大約產(chǎn)生 2000 條消息音婶,Consumer utilisation 代表了消費(fèi)者的工作效率慨畸,一般效率低有幾種情況

  • 消費(fèi)者太少
  • ACK 回執(zhí)速度太慢
  • 消費(fèi)者太多

首先我們沒有采用 ACK 機(jī)制,這樣就不存在這個(gè)問題桃熄,第二 Exchange 和 Queue 在建立的時(shí)候先口,采用了 fanout 模式并且持久化,持久化和非持久化大約有 10 倍的性能差異瞳收,如果只是單存的針對同一個(gè)隊(duì)列增加 Consumer,并不會(huì)改善效率厢汹,而 fanout 的廣播模式不利于增加多個(gè) Queue螟深。

解決辦法:重建了 Exchange 和 Queue,采用 direct 模式且非持久化的方式烫葬,對同一個(gè) Exchange 綁定了 5 個(gè) Queue界弧,生產(chǎn)者隨機(jī)的將消息分發(fā)到某個(gè)隊(duì)列,每個(gè) Queue 會(huì)對應(yīng)一個(gè)消費(fèi)者搭综。因?yàn)橄⒈旧硎侨罩竟富罩居袝r(shí)間的,所以不存在時(shí)序的問題兑巾,這樣就大大的提高了消費(fèi)者的工作效率条获,通過這樣的改進(jìn)以后,Consomer utilisation 基本處在 100%蒋歌,而且也沒有出現(xiàn)隊(duì)列積壓帅掘。

內(nèi)存與流量控制參數(shù)

  • prefetch 是每次從一次性從 broker 里面取的待消費(fèi)的消息的個(gè)數(shù),值太大會(huì)增加延遲堂油,太小會(huì)導(dǎo)致消息積壓修档。
  • vm_memory_high_watermark 內(nèi)存流量控制,默認(rèn) 0.4(還可以是絕對值)府框,當(dāng)占用物理內(nèi)存的 40% 時(shí)吱窝,它會(huì)引起一個(gè)內(nèi)存報(bào)警并且阻塞所有連接。 百分比情況下可使用內(nèi)存 vm_memory_limit = vm_memory_high_watermark * 物理內(nèi)存迫靖,絕對值情況下 vm_memory_limit = vm_memory_high_watermark院峡。
$ rabbitmqctl status | grep vm_memory
 {vm_memory_high_watermark,0.4},
 {vm_memory_limit,40530786713},
  • vm_memory_high_watermark_paging_ratio 確定了何時(shí)執(zhí)行消息從內(nèi)存轉(zhuǎn)移到硬盤,默認(rèn) 0.5袜香,當(dāng)內(nèi)存消耗 vm_memory_limit * 0.5 時(shí)撕予,開始從內(nèi)存轉(zhuǎn)移到硬盤。

PS:
使用 RabbitMQ 時(shí)蜈首,創(chuàng)建 Exchange 和 Queue 要注意自己的使用場景实抡,是否需要持久化欠母,是否需要 ACK 機(jī)制,消息分發(fā)模式吆寨,是否有時(shí)序要求等等赏淌,千萬不要隨便建個(gè) fanout 模式放那就用。

參考

https://www.rabbitmq.com/documentation.html
https://emacsist.github.io/tags/#rabbitmq
http://lynnkong.iteye.com/blog/1699684
https://www.gitbook.com/book/geewu/rabbitmq-quick

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末啄清,一起剝皮案震驚了整個(gè)濱河市六水,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌辣卒,老刑警劉巖掷贾,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異荣茫,居然都是意外死亡想帅,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進(jìn)店門啡莉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來港准,“玉大人,你說我怎么就攤上這事咧欣∏掣祝” “怎么了?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵魄咕,是天一觀的道長衩椒。 經(jīng)常有香客問我,道長蚕礼,這世上最難降的妖魔是什么烟具? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮奠蹬,結(jié)果婚禮上朝聋,老公的妹妹穿的比我還像新娘。我一直安慰自己囤躁,他們只是感情好冀痕,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著狸演,像睡著了一般言蛇。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上宵距,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天腊尚,我揣著相機(jī)與錄音,去河邊找鬼满哪。 笑死婿斥,一個(gè)胖子當(dāng)著我的面吹牛劝篷,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播民宿,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼娇妓,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了活鹰?” 一聲冷哼從身側(cè)響起哈恰,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎志群,沒想到半個(gè)月后着绷,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡赖舟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年蓬戚,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宾抓。...
    茶點(diǎn)故事閱讀 40,090評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖豫喧,靈堂內(nèi)的尸體忽然破棺而出石洗,到底是詐尸還是另有隱情,我是刑警寧澤紧显,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布讲衫,位于F島的核電站,受9級特大地震影響孵班,放射性物質(zhì)發(fā)生泄漏涉兽。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一篙程、第九天 我趴在偏房一處隱蔽的房頂上張望枷畏。 院中可真熱鬧,春花似錦虱饿、人聲如沸拥诡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽渴肉。三九已至,卻和暖如春爽冕,著一層夾襖步出監(jiān)牢的瞬間仇祭,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工颈畸, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留乌奇,地道東北人没讲。 一個(gè)月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像华弓,于是被迫代替她去往敵國和親食零。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 來源 RabbitMQ是用Erlang實(shí)現(xiàn)的一個(gè)高并發(fā)高可靠AMQP消息隊(duì)列服務(wù)器寂屏。支持消息的持久化贰谣、事務(wù)、擁塞控...
    jiangmo閱讀 10,361評論 2 34
  • rabbitMQ是一款基于AMQP協(xié)議的消息中間件迁霎,它能夠在應(yīng)用之間提供可靠的消息傳輸吱抚。在易用性,擴(kuò)展性考廉,高可用性...
    點(diǎn)融黑幫閱讀 3,003評論 3 41
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理秘豹,服務(wù)發(fā)現(xiàn),斷路器昌粤,智...
    卡卡羅2017閱讀 134,659評論 18 139
  • 關(guān)于消息隊(duì)列既绕,從前年開始斷斷續(xù)續(xù)看了些資料,想寫很久了涮坐,但一直沒騰出空凄贩,近來分別碰到幾個(gè)朋友聊這塊的技術(shù)選型,是時(shí)...
    預(yù)流閱讀 584,754評論 51 786
  • 1. 歷史 RabbitMQ是一個(gè)由erlang開發(fā)的AMQP(Advanced Message Queue )的...
    高廣超閱讀 6,096評論 3 51