每日一結(jié)——RabbitMQ

RabbitMQ結(jié)構(gòu)

image.png
  • 左側(cè) P 代表 生產(chǎn)者需纳,也就是往 RabbitMQ 發(fā)消息的程序。
  • 中間即是 RabbitMQ艺挪,其中包括了 交換機(jī) 和 隊(duì)列不翩。
  • 右側(cè) C 代表 消費(fèi)者,也就是往 RabbitMQ 拿消息的程序麻裳。

一般的隊(duì)列服務(wù):發(fā)消息口蝠,隊(duì)列,收消息津坑,RabbitMQ在生產(chǎn)者和隊(duì)列之間加入了交換機(jī)(Exchange)妙蔗,這樣解耦了生產(chǎn)者與隊(duì)列之間的聯(lián)系,轉(zhuǎn)變?yōu)橛山粨Q機(jī)把消息根據(jù)調(diào)度策略把消息給隊(duì)列疆瑰。

為什么要使用MQ眉反?

  1. 異步處理
    比如注冊,用戶注冊完成后需要發(fā)短信乃摹,在這里短信不是必須的禁漓,它只是一個通知。
  2. 流量削峰
    秒殺系統(tǒng)孵睬,用戶請求寫入消息隊(duì)列播歼,設(shè)置隊(duì)列最大長度,如果超過掰读,則直接丟棄也就是用戶直接進(jìn)入錯誤頁面秘狞。


    image.png
  3. 服務(wù)解耦
    假設(shè)服務(wù)A產(chǎn)生數(shù)據(jù), 而服務(wù)B,C,D需要這些數(shù)據(jù), 那么我們就需要在A服務(wù)中直接調(diào)用B,C,D服務(wù),把數(shù)據(jù)傳遞到下游服務(wù)。如果服務(wù)越來越多蹈集,再考慮到下游服務(wù)出錯的情況烁试,處理將會越來越復(fù)雜÷K粒可以轉(zhuǎn)變?yōu)锳發(fā)布消息减响,B,C,D依照自己的需要訂閱或者不訂閱。

如果確保消息正確發(fā)送到RabbitMQ郭怪,如何確保消息接收方消費(fèi)了消息支示?

消息發(fā)送確認(rèn)

  • publisher-confirms模式,該模式關(guān)系消息有沒有傳遞到Exchange鄙才,不關(guān)心從Exchange到?jīng)]到queue
  • publisher-returns模式颂鸿,該模式會在消息沒有被路由到queues時(shí)將消息返回

消息消費(fèi)確認(rèn)

RabbitMQ默認(rèn)是自動確認(rèn),自動被確認(rèn)消費(fèi)會從MQ中刪除可以攒庵。
可以設(shè)置為手動確認(rèn)嘴纺,那么成功后channel.basicAck(long deliveryTag, boolean multiple);失敗后需要channel.basicNack(long deliveryTag, boolean multiple, boolean requeue);

消息基于什么傳輸败晴?

由于TCP連接的創(chuàng)建和銷毀開銷很大,且并發(fā)數(shù)受系統(tǒng)資源限制栽渴,會造成性能瓶頸尖坤。RabbitMQ使用信道的方式來傳輸數(shù)據(jù),信道(channel)是建立在真實(shí)TCP基礎(chǔ)上的虛擬連接闲擦,且每條TCP上的通道數(shù)量沒有限制糖驴。

如何避免消息重復(fù)投遞和重復(fù)消費(fèi)?

在消息生產(chǎn)時(shí)佛致,MQ內(nèi)部針對每條消息生成一個inner-msg-id,作為去重的依據(jù)辙谜。
在消息消費(fèi)時(shí)俺榆,要求消息體中必須要有一個bizId作為去重的依據(jù),避免同一條消息被重復(fù)消費(fèi)装哆。

如何確保消息不丟失罐脊?

消息持久化,前提是隊(duì)列持久化
RabbitMQ宕機(jī)重啟恢復(fù)方式是蜕琴,寫入磁盤上的持久化日志文件萍桌。

消息怎么路由?

消息提供方-->路由-->一至多個隊(duì)列
消息發(fā)布到交換器時(shí)凌简,消息將擁有一個路由鍵上炎;
通過隊(duì)列路由鍵,可以把隊(duì)列綁定到交換器上雏搂;
消息到達(dá)交換器后藕施,RabbitMQ會將消息的路由鍵與隊(duì)列的路由鍵進(jìn)行匹配。
常見的交換器有三種:
fanout:如果交換器收到消息凸郑,將會廣播到所以綁定的隊(duì)列
direct:如果路由鍵完全匹配裳食,消息被投遞到相應(yīng)的隊(duì)列
topic:可以是來自不同源頭的消息能夠到達(dá)同一隊(duì)列,使用topic交換器時(shí)芙沥,可以使用通配符诲祸。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市而昨,隨后出現(xiàn)的幾起案子救氯,更是在濱河造成了極大的恐慌,老刑警劉巖配紫,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件径密,死亡現(xiàn)場離奇詭異,居然都是意外死亡躺孝,警方通過查閱死者的電腦和手機(jī)享扔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門底桂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人惧眠,你說我怎么就攤上這事籽懦。” “怎么了氛魁?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵暮顺,是天一觀的道長。 經(jīng)常有香客問我秀存,道長捶码,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上纫雁,老公的妹妹穿的比我還像新娘。我一直安慰自己祈纯,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布叼耙。 她就那樣靜靜地躺著腕窥,像睡著了一般。 火紅的嫁衣襯著肌膚如雪筛婉。 梳的紋絲不亂的頭發(fā)上簇爆,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天,我揣著相機(jī)與錄音倾贰,去河邊找鬼冕碟。 笑死,一個胖子當(dāng)著我的面吹牛匆浙,可吹牛的內(nèi)容都是我干的安寺。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼首尼,長吁一口氣:“原來是場噩夢啊……” “哼挑庶!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起软能,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤迎捺,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后查排,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體凳枝,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了岖瑰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片叛买。...
    茶點(diǎn)故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蹋订,靈堂內(nèi)的尸體忽然破棺而出率挣,到底是詐尸還是另有隱情,我是刑警寧澤露戒,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布椒功,位于F島的核電站,受9級特大地震影響智什,放射性物質(zhì)發(fā)生泄漏动漾。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一荠锭、第九天 我趴在偏房一處隱蔽的房頂上張望谦炬。 院中可真熱鬧,春花似錦节沦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至看蚜,卻和暖如春叫搁,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背供炎。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工渴逻, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人音诫。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓惨奕,卻偏偏與公主長得像,于是被迫代替她去往敵國和親竭钝。 傳聞我的和親對象是個殘疾皇子梨撞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評論 2 353