RabbitMq

1. 結(jié)構(gòu)

rabbit.PNG

消息服務(wù)器包含以下角色:

  1. vhost:虛擬機(jī),不同虛擬機(jī)內(nèi)可以有各自獨立的配置瞬欧,如權(quán)限
  2. exchange:用于消息分發(fā)
  3. queue:緩存消息
  4. route:隊列與exchange的綁定關(guān)系收苏,exchange收到消息后根據(jù)消息的route-key將消息轉(zhuǎn)發(fā)到相應(yīng)的隊列仙逻。
  5. channel: 在client與消息服務(wù)器之間的tcp連接中,開辟多個channel提完,每個線程使用其中一個channel粘捎,避免連接數(shù)過多薇缅。

2.工作流程

  1. producer產(chǎn)生消息,指定消息的exchange和routekey晌端,將消息發(fā)到指定exchange
  2. exchange收到消息捅暴,匹配routekey的隊列恬砂,將消息發(fā)送到隊列咧纠。
  3. consumer從監(jiān)聽的隊列獲取消息并消費(fèi)。

3. exchange

direct:發(fā)送到路由鍵完全匹配的隊列
fanout:廣播到當(dāng)前exchange綁定的所有隊列
topic:可使用通配符部分匹配route-key,將消息發(fā)送至匹配的隊列泻骤。

4. 可靠性保證

1.broker確認(rèn):生產(chǎn)者到broker的可靠性保證漆羔。

2.broker持久化:防止broker宕機(jī)丟失數(shù)據(jù)梧奢。

3.消費(fèi)者確認(rèn)

消費(fèi)者接收每一條消息后都必須進(jìn)行確認(rèn),只有消費(fèi)者確認(rèn)了消息演痒,RabbitMQ才能安全地把消息從隊列中刪除亲轨。這里并沒有用到超時機(jī)制,RabbitMQ僅通過Consumer的連接中斷來確認(rèn)是否需 要重新發(fā)送消息鸟顺。也就是說惦蚊,只要連接不中斷,RabbitMQ給了Consumer足夠長 的時間來處理消息讯嫂。保證數(shù)據(jù)的最終一致性蹦锋。
消費(fèi)者確認(rèn)機(jī)制有兩個須注意的問題:
(1) 如果消費(fèi)者接收到消息,在確認(rèn)之前斷開了連接或取消訂閱欧芽,RabbitMQ會 認(rèn)為消息沒有被分發(fā)莉掂,然后重新分發(fā)給下一個訂閱的消費(fèi)者。
(2) 如果消費(fèi)者接收到消息卻沒有確認(rèn)消息千扔,連接也未斷開憎妙,則RabbitMQ認(rèn)為 該消費(fèi)者繁忙,將不會給該消費(fèi)者分發(fā)更多的消息曲楚。

確認(rèn)和持久化不能完全保證可靠厘唾,broker中已確認(rèn)的消息,在節(jié)點宕機(jī)數(shù)據(jù)無法恢復(fù)時洞渤,消息發(fā)生丟失阅嘶。
解決方案:

  • 方案1. 隊列需要鏡像,保證高可用
  • 方案2. 消息補(bǔ)償载迄。發(fā)送讯柔、接收消息時,需要記錄消息狀態(tài)护昧,檢查是否被消費(fèi)魂迄。

5.消息重復(fù)消費(fèi)

第4節(jié)主要保證消息至少被消費(fèi)一次,但由于重發(fā)機(jī)制惋耙,消息可能會重復(fù)消費(fèi)捣炬。
解決方案:冪等性保證,消息中攜帶唯一業(yè)務(wù)id绽榛,消費(fèi)時檢查id是否已消費(fèi)湿酸。
場景:

  1. 插入數(shù)據(jù)庫:數(shù)據(jù)庫建立unique key約束
  2. 非冪等的update操作:如扣款50等更新,先檢查消息id是否已被消費(fèi)灭美。

6. 延遲隊列

  1. ttl
    可以對queue和message分別設(shè)置ttl推溃,過期的消息稱為dead letter。
  2. 死信隊列
    可以為死信指定交換機(jī)和route-key届腐,重新將死信進(jìn)行路由铁坎,發(fā)送到隊列處理蜂奸。
  3. 成為deal letter條件
    1. 有過期message
    2. 隊列長度達(dá)到最大值
    3. 消息被拒絕且不再重新入隊

7.工作模式

simple:一個隊列一個消費(fèi)者
worker:一個隊列多個消費(fèi)者,爭搶消息


image.png

發(fā)布訂閱:通過隊列與exchange的綁定關(guān)系完成消息分發(fā)硬萍。


image.png

8.順序消費(fèi)

需求:生產(chǎn)者產(chǎn)生一組消息扩所,組內(nèi)消息需要被順序消費(fèi)。
方案:生產(chǎn)者到隊列朴乖、隊列到消費(fèi)者都需要順序發(fā)送祖屏,并在前一條消息處理完成之后返回信號,獲取下一條消息买羞。
producer -> queue:生產(chǎn)的消息需放入本地隊列緩存赐劣,發(fā)送一條消息時加鎖;broker收到消息并發(fā)送到隊列后哩都,返回確認(rèn)魁兼;生產(chǎn)者收到確認(rèn)后釋放鎖發(fā)送下一條消息。
queue -> consumer: 同樣須加鎖漠嵌,收到消費(fèi)者的確認(rèn)后咐汞,釋放鎖發(fā)送下一條消息。
此時儒鹿,一個隊列只能有一個消費(fèi)者化撕。如果需要多個消費(fèi)者,則需要建立多個隊列约炎。生產(chǎn)者根據(jù)消息分組id求哈希值植阴,將同一分組的消息發(fā)送到相同隊列。

9.集群

普通集群:某節(jié)點掛了圾浅,則節(jié)點上消息不可用掠手,需重啟節(jié)點。
鏡像模式:同一隊列在多個節(jié)點上建立數(shù)據(jù)備份

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末狸捕,一起剝皮案震驚了整個濱河市喷鸽,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌灸拍,老刑警劉巖做祝,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異鸡岗,居然都是意外死亡混槐,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進(jìn)店門轩性,熙熙樓的掌柜王于貴愁眉苦臉地迎上來声登,“玉大人,你說我怎么就攤上這事“乒危” “怎么了?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵舒岸,是天一觀的道長绅作。 經(jīng)常有香客問我,道長蛾派,這世上最難降的妖魔是什么俄认? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮洪乍,結(jié)果婚禮上眯杏,老公的妹妹穿的比我還像新娘。我一直安慰自己壳澳,他們只是感情好岂贩,可當(dāng)我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著巷波,像睡著了一般萎津。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上抹镊,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天锉屈,我揣著相機(jī)與錄音,去河邊找鬼垮耳。 笑死颈渊,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的终佛。 我是一名探鬼主播俊嗽,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼铃彰!你這毒婦竟也來了乌询?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤豌研,失蹤者是張志新(化名)和其女友劉穎妹田,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鹃共,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡鬼佣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了霜浴。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片晶衷。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出晌纫,到底是詐尸還是另有隱情税迷,我是刑警寧澤,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布锹漱,位于F島的核電站箭养,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏哥牍。R本人自食惡果不足惜毕泌,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望嗅辣。 院中可真熱鬧撼泛,春花似錦、人聲如沸澡谭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蛙奖。三九已至抠忘,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間外永,已是汗流浹背崎脉。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留伯顶,地道東北人囚灼。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像祭衩,于是被迫代替她去往敵國和親灶体。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,446評論 2 348

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