RabbitMQ復(fù)習(xí)筆記

1. RabbitMQ 基本概念

RabbitMQ模型
  • Message
    消息沫勿,消息是不具名的挨约,它由消息頭和消息體組成。消息體是不透明的产雹,而消息頭則由一系列的可選屬性組成诫惭,這些屬性包括routing-key(路由鍵)、priority(相對(duì)于其他消息的優(yōu)先權(quán))洽故、delivery-mode(指出該消息可能需要持久性存儲(chǔ))等贝攒。
  • Publisher
    消息的生產(chǎn)者,也是一個(gè)向交換器發(fā)布消息的客戶端應(yīng)用程序时甚。
  • Exchange
    交換器隘弊,用來接收生產(chǎn)者發(fā)送的消息并將這些消息路由給服務(wù)器中的隊(duì)列。
  • Binding
    綁定荒适,用于消息隊(duì)列和交換器之間的關(guān)聯(lián)梨熙。一個(gè)綁定就是基于路由鍵將交換器和消息隊(duì)列連接起來的路由規(guī)則,所以可以將交換器理解成一個(gè)由綁定構(gòu)成的路由表刀诬。
  • Queue
    消息隊(duì)列澈蚌,用來保存消息直到發(fā)送給消費(fèi)者章姓。它是消息的容器晌柬,也是消息的終點(diǎn)共郭。一個(gè)消息可投入一個(gè)或多個(gè)隊(duì)列。消息一直在隊(duì)列里面糠馆,等待消費(fèi)者連接到這個(gè)隊(duì)列將其取走嘶伟。
  • Connection
    網(wǎng)絡(luò)連接,比如一個(gè)TCP連接又碌。
  • Channel
    信道九昧,多路復(fù)用連接中的一條獨(dú)立的雙向數(shù)據(jù)流通道。信道是建立在真實(shí)的TCP連接內(nèi)地虛擬連接毕匀,AMQP 命令都是通過信道發(fā)出去的铸鹰,不管是發(fā)布消息、訂閱隊(duì)列還是接收消息皂岔,這些動(dòng)作都是通過信道完成蹋笼。因?yàn)閷?duì)于操作系統(tǒng)來說建立和銷毀 TCP 都是非常昂貴的開銷,所以引入了信道的概念,以復(fù)用一條 TCP 連接姓建。
  • Consumer
    消息的消費(fèi)者诞仓,表示一個(gè)從消息隊(duì)列中取得消息的客戶端應(yīng)用程序缤苫。
  • Virtual Host
    虛擬主機(jī)速兔,表示一批交換器、消息隊(duì)列和相關(guān)對(duì)象活玲。虛擬主機(jī)是共享相同的身份認(rèn)證和加密環(huán)境的獨(dú)立服務(wù)器域涣狗。每個(gè) vhost 本質(zhì)上就是一個(gè) mini 版的 RabbitMQ 服務(wù)器,擁有自己的隊(duì)列舒憾、交換器镀钓、綁定和權(quán)限機(jī)制。vhost 是 AMQP 概念的基礎(chǔ)镀迂,必須在連接時(shí)指定丁溅,RabbitMQ 默認(rèn)的 vhost 是 / 。
  • Broker
    表示消息隊(duì)列服務(wù)器實(shí)體探遵。

2. Exchange 類型

  • direct

    direct

    消息中的路由鍵(routing key)如果和 Binding 中的 binding key 一致窟赏, 交換器就將消息發(fā)到對(duì)應(yīng)的隊(duì)列中。路由鍵與隊(duì)列名完全匹配箱季,如果一個(gè)隊(duì)列綁定到交換機(jī)要求路由鍵為“dog”涯穷,則只轉(zhuǎn)發(fā) routing key 標(biāo)記為“dog”的消息,不會(huì)轉(zhuǎn)發(fā)“dog.puppy”藏雏,也不會(huì)轉(zhuǎn)發(fā)“dog.guard”等等拷况。它是完全匹配、單播的模式掘殴。

  • fanout

    fanout

    每個(gè)發(fā)到 fanout 類型交換器的消息都會(huì)分到所有綁定的隊(duì)列上去赚瘦。fanout 交換器不處理路由鍵,只是簡單的將隊(duì)列綁定到交換器上奏寨,每個(gè)發(fā)送到交換器的消息都會(huì)被轉(zhuǎn)發(fā)到與該交換器綁定的所有隊(duì)列上起意。很像子網(wǎng)廣播,每臺(tái)子網(wǎng)內(nèi)的主機(jī)都獲得了一份復(fù)制的消息服爷。fanout 類型轉(zhuǎn)發(fā)消息是最快的杜恰。

  • topic

    topic

    topic 交換器通過模式匹配分配消息的路由鍵屬性,將路由鍵和某個(gè)模式進(jìn)行匹配仍源,此時(shí)隊(duì)列需要綁定到一個(gè)模式上心褐。它將路由鍵和綁定鍵的字符串切分成單詞,這些單詞之間用點(diǎn)隔開笼踩。它同樣也會(huì)識(shí)別兩個(gè)通配符:符號(hào)“#”和符號(hào)“”逗爹。#匹配0個(gè)或多個(gè)單詞,匹配不多不少一個(gè)單詞。


3. RabbitMQ 使用常見問題

1.RabbitMQ的高可用性

  • 普通集群模式

意思就是在多臺(tái)機(jī)器上啟動(dòng)多個(gè)rabbitmq實(shí)例掘而,每個(gè)機(jī)器啟動(dòng)一個(gè)挟冠。但是你創(chuàng)建的queue,只會(huì)放在一個(gè)rabbtimq實(shí)例上袍睡,但是每個(gè)實(shí)例都同步queue的元數(shù)據(jù)知染。完了你消費(fèi)的時(shí)候,實(shí)際上如果連接到了另外一個(gè)實(shí)例斑胜,那么那個(gè)實(shí)例會(huì)從queue所在實(shí)例上拉取數(shù)據(jù)過來控淡。
這種方式確實(shí)很麻煩,也不怎么好止潘,沒做到所謂的分布式掺炭,就是個(gè)普通集群。因?yàn)檫@導(dǎo)致你要么消費(fèi)者每次隨機(jī)連接一個(gè)實(shí)例然后拉取數(shù)據(jù)凭戴,要么固定連接那個(gè)queue所在實(shí)例消費(fèi)數(shù)據(jù)涧狮,前者有數(shù)據(jù)拉取的開銷,后者導(dǎo)致單實(shí)例性能瓶頸么夫。
而且如果那個(gè)放queue的實(shí)例宕機(jī)了者冤,會(huì)導(dǎo)致接下來其他實(shí)例就無法從那個(gè)實(shí)例拉取,如果你開啟了消息持久化魏割,讓rabbitmq落地存儲(chǔ)消息的話譬嚣,消息不一定會(huì)丟,得等這個(gè)實(shí)例恢復(fù)了钞它,然后才可以繼續(xù)從這個(gè)queue拉取數(shù)據(jù)拜银。
所以這個(gè)事兒就比較尷尬了,這就沒有什么所謂的高可用性可言了遭垛,這方案主要是提高吞吐量的尼桶,就是說讓集群中多個(gè)節(jié)點(diǎn)來服務(wù)某個(gè)queue的讀寫操作。

  • 鏡像集群模式

這種模式锯仪,才是所謂的rabbitmq的高可用模式泵督,跟普通集群模式不一樣的是,你創(chuàng)建的queue庶喜,無論元數(shù)據(jù)還是queue里的消息都會(huì)存在于多個(gè)實(shí)例上小腊,然后每次你寫消息到queue的時(shí)候,都會(huì)自動(dòng)把消息到多個(gè)實(shí)例的queue里進(jìn)行消息同步久窟。
這樣的話秩冈,好處在于,你任何一個(gè)機(jī)器宕機(jī)了斥扛,沒事兒入问,別的機(jī)器都可以用。壞處在于,第一芬失,這個(gè)性能開銷也太大了吧楣黍,消息同步所有機(jī)器,導(dǎo)致網(wǎng)絡(luò)帶寬壓力和消耗很重棱烂!第二租漂,這么玩兒,就沒有擴(kuò)展性可言了垢啼,如果某個(gè)queue負(fù)載很重窜锯,你加機(jī)器,新增的機(jī)器也包含了這個(gè)queue的所有數(shù)據(jù)芭析,并沒有辦法線性擴(kuò)展你的queue
那么怎么開啟這個(gè)鏡像集群模式呢?我這里簡單說一下吞瞪,避免面試人家問你你不知道馁启,其實(shí)很簡單rabbitmq有很好的管理控制臺(tái),就是在后臺(tái)新增一個(gè)策略芍秆,這個(gè)策略是鏡像集群模式的策略惯疙,指定的時(shí)候可以要求數(shù)據(jù)同步到所有節(jié)點(diǎn)的,也可以要求就同步到指定數(shù)量的節(jié)點(diǎn)妖啥,然后你再次創(chuàng)建queue的時(shí)候霉颠,應(yīng)用這個(gè)策略,就會(huì)自動(dòng)將數(shù)據(jù)同步到其他的節(jié)點(diǎn)上去了荆虱。

2.RabbitMQ消息重復(fù)消費(fèi)問題
可以消費(fèi)端消費(fèi)時(shí)蒿偎,利用redis加一個(gè)消費(fèi)標(biāo)志,如果消費(fèi)過了就不繼續(xù)

3.RabbitMQ消息丟失問題
保證消息不丟失可以通過三個(gè)操作

  • 1.生產(chǎn)者發(fā)送消息時(shí)怀读,使用confirm機(jī)制
  • 2.broker端設(shè)置消息時(shí)持久化诉位,設(shè)置持久化有兩個(gè)步驟,第一個(gè)是創(chuàng)建queue的時(shí)候?qū)⑵湓O(shè)置為持久化的菜枷,這樣就可以保證rabbitmq持久化queue的元數(shù)據(jù)苍糠,但是不會(huì)持久化queue里的數(shù)據(jù);第二個(gè)是發(fā)送消息的時(shí)候?qū)⑾⒌膁eliveryMode設(shè)置為2啤誊,就是將消息設(shè)置為持久化的岳瞭,此時(shí)rabbitmq就會(huì)將消息持久化到磁盤上去。必須要同時(shí)設(shè)置這兩個(gè)持久化才行蚊锹,rabbitmq哪怕是掛了瞳筏,再次重啟,也會(huì)從磁盤上重啟恢復(fù)queue枫耳,恢復(fù)這個(gè)queue里的數(shù)據(jù)乏矾。
  • 3.消費(fèi)端用rabbitmq提供的ack機(jī)制,關(guān)閉rabbitmq自動(dòng)ack

4.RabbitMQ消息順序問題

RabbitMQ消息順序問題

將需要順序的消息,寫到同一個(gè)queue里钻心,然后單獨(dú)指定一個(gè)消費(fèi)者消費(fèi)這個(gè)queue

5.RabbitMQ消息積壓問題

  • (1)如果你積壓了幾百萬到上千萬的數(shù)據(jù)凄硼,即使消費(fèi)者恢復(fù)了,也需要大概1小時(shí)的時(shí)間才能恢復(fù)過來
    一般這個(gè)時(shí)候捷沸,只能操作臨時(shí)緊急擴(kuò)容了摊沉,具體操作步驟和思路如下:
    1)先修復(fù)consumer的問題,確保其恢復(fù)消費(fèi)速度痒给,然后將現(xiàn)有cnosumer都停掉
    2)新建一個(gè)topic说墨,partition是原來的10倍,臨時(shí)建立好原先10倍或者20倍的queue數(shù)量
    3)然后寫一個(gè)臨時(shí)的分發(fā)數(shù)據(jù)的consumer程序苍柏,這個(gè)程序部署上去消費(fèi)積壓的數(shù)據(jù)尼斧,消費(fèi)之后不做耗時(shí)的處理,直接均勻輪詢寫入臨時(shí)建立好的10倍數(shù)量的queue
    4)接著臨時(shí)征用10倍的機(jī)器來部署consumer试吁,每一批consumer消費(fèi)一個(gè)臨時(shí)queue的數(shù)據(jù)
    5)這種做法相當(dāng)于是臨時(shí)將queue資源和consumer資源擴(kuò)大10倍棺棵,以正常的10倍速度來消費(fèi)數(shù)據(jù)
    6)等快速消費(fèi)完積壓數(shù)據(jù)之后,得恢復(fù)原先部署架構(gòu)熄捍,重新用原先的consumer機(jī)器來消費(fèi)消息

  • (2)這里我們假設(shè)再來第二個(gè)坑

假設(shè)你用的是rabbitmq烛恤,rabbitmq是可以設(shè)置過期時(shí)間的,就是TTL余耽,如果消息在queue中積壓超過一定的時(shí)間就會(huì)被rabbitmq給清理掉缚柏,這個(gè)數(shù)據(jù)就沒了。那這就是第二個(gè)坑了碟贾。這就不是說數(shù)據(jù)會(huì)大量積壓在mq里币喧,而是大量的數(shù)據(jù)會(huì)直接搞丟。
這個(gè)情況下缕陕,就不是說要增加consumer消費(fèi)積壓的消息粱锐,因?yàn)閷?shí)際上沒啥積壓,而是丟了大量的消息扛邑。我們可以采取一個(gè)方案怜浅,就是批量重導(dǎo),這個(gè)我們之前線上也有類似的場景干過蔬崩。就是大量積壓的時(shí)候恶座,我們當(dāng)時(shí)就直接丟棄數(shù)據(jù)了,然后等過了高峰期以后沥阳,比如大家一起喝咖啡熬夜到晚上12點(diǎn)以后跨琳,用戶都睡覺了。
這個(gè)時(shí)候我們就開始寫程序桐罕,將丟失的那批數(shù)據(jù)脉让,寫個(gè)臨時(shí)程序桂敛,一點(diǎn)一點(diǎn)的查出來,然后重新灌入mq里面去溅潜,把白天丟的數(shù)據(jù)給他補(bǔ)回來术唬。也只能是這樣了。
假設(shè)1萬個(gè)訂單積壓在mq里面滚澜,沒有處理粗仓,其中1000個(gè)訂單都丟了,你只能手動(dòng)寫程序把那1000個(gè)訂單給查出來设捐,手動(dòng)發(fā)到mq里去再補(bǔ)一次

  • (3)然后我們?cè)賮砑僭O(shè)第三個(gè)坑

如果走的方式是消息積壓在mq里借浊,那么如果你很長時(shí)間都沒處理掉,此時(shí)導(dǎo)致mq都快寫滿了萝招,咋辦蚂斤?這個(gè)還有別的辦法嗎?沒有即寒,誰讓你第一個(gè)方案執(zhí)行的太慢了橡淆,你臨時(shí)寫程序,接入數(shù)據(jù)來消費(fèi)母赵,消費(fèi)一個(gè)丟棄一個(gè),都不要了具滴,快速消費(fèi)掉所有的消息凹嘲。然后走第二個(gè)方案,到了晚上再補(bǔ)數(shù)據(jù)吧构韵。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末周蹭,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子疲恢,更是在濱河造成了極大的恐慌凶朗,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,270評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件显拳,死亡現(xiàn)場離奇詭異棚愤,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)杂数,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門宛畦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人揍移,你說我怎么就攤上這事次和。” “怎么了那伐?”我有些...
    開封第一講書人閱讀 165,630評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵踏施,是天一觀的道長石蔗。 經(jīng)常有香客問我,道長畅形,這世上最難降的妖魔是什么养距? 我笑而不...
    開封第一講書人閱讀 58,906評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮束亏,結(jié)果婚禮上铃在,老公的妹妹穿的比我還像新娘。我一直安慰自己碍遍,他們只是感情好定铜,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著怕敬,像睡著了一般揣炕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上东跪,一...
    開封第一講書人閱讀 51,718評(píng)論 1 305
  • 那天畸陡,我揣著相機(jī)與錄音,去河邊找鬼虽填。 笑死丁恭,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的斋日。 我是一名探鬼主播牲览,決...
    沈念sama閱讀 40,442評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼恶守!你這毒婦竟也來了第献?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,345評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤兔港,失蹤者是張志新(化名)和其女友劉穎庸毫,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體衫樊,經(jīng)...
    沈念sama閱讀 45,802評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡飒赃,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了橡伞。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片盒揉。...
    茶點(diǎn)故事閱讀 40,117評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖兑徘,靈堂內(nèi)的尸體忽然破棺而出刚盈,到底是詐尸還是另有隱情,我是刑警寧澤挂脑,帶...
    沈念sama閱讀 35,810評(píng)論 5 346
  • 正文 年R本政府宣布藕漱,位于F島的核電站欲侮,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏肋联。R本人自食惡果不足惜威蕉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望橄仍。 院中可真熱鬧韧涨,春花似錦、人聲如沸侮繁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽宪哩。三九已至娩贷,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間锁孟,已是汗流浹背彬祖。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留品抽,地道東北人储笑。 一個(gè)月前我還...
    沈念sama閱讀 48,377評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像圆恤,于是被迫代替她去往敵國和親南蓬。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評(píng)論 2 355

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

  • http://liuxing.info/2017/06/30/Spring%20AMQP%E4%B8%AD%E6%...
    sherlock_6981閱讀 15,925評(píng)論 2 11
  • 什么叫消息隊(duì)列 消息(Message)是指在應(yīng)用間傳送的數(shù)據(jù)哑了。消息可以非常簡單,比如只包含文本字符串烧颖,也可以更復(fù)雜...
    lijun_m閱讀 1,348評(píng)論 0 1
  • RabbitMQ 簡介 MQ 消息隊(duì)列弱左,上承生產(chǎn)者,下接消費(fèi)者炕淮。從生產(chǎn)者側(cè)獲取消息拆火,然后將消息轉(zhuǎn)發(fā)給消費(fèi)者。由此可...
    2205閱讀 3,499評(píng)論 1 11
  • 什么叫消息隊(duì)列涂圆? 消息(Message)是指在應(yīng)用間傳送的數(shù)據(jù)们镜。消息可以非常簡單,比如只包含文本字符串润歉,也可以更復(fù)...
    Agile_dev閱讀 2,375評(píng)論 0 24
  • 風(fēng)不語模狭,才入弄堂又辭去 素衣合窗,驚覺杏花雨 月靜謐踩衩,更不熄嚼鹉,誤人意 悲歡離合總關(guān)情贩汉,惹人泣 羌笛曲,銹鐵衣锚赤,展旌...
    安語乎閱讀 247評(píng)論 0 0