Rabbitmq如何保證不丟消息

背景介紹:

筆者最近研究了下rabbitmq碳抄,便很好奇它是怎么保證不丟失消息的呢犁苏?于是便整理了這篇文章來跟大家分享下,自己的理解聂儒,如有不準確的地方或者不同的意見虎锚,還請各位能夠給出反饋,我們可以討論衩婚,相互學習窜护,相互成長。

基礎(chǔ)知識:

在開始探討這個問題之前非春,筆者還是覺得很有必要將rabbitmq的架構(gòu)等基礎(chǔ)知識回顧下柱徙,如下所示:

對于使用rabbitmq的服務(wù)來說,主要由三部分構(gòu)成奇昙,它們分別是:生產(chǎn)者护侮,rabbitmq,消費者储耐。這三者之間是通過網(wǎng)絡(luò)來進行通訊的羊初,其中與生產(chǎn)者對應(yīng)的是exchange,與消費者對應(yīng)的是connection什湘,而rabbitmq內(nèi)部又由exchange长赞,queue晦攒,connection三部分構(gòu)成。

消息的流程:消息是由生產(chǎn)者生產(chǎn)了之后得哆,上報給exchange勤家,exchange綁定并存儲到queue中,再傳遞給最終的消費者手里柳恐。

如此以來,整個過程就分成了三大場景:

場景1: 生產(chǎn)者與exchange的上報消息热幔,如何保證不丟失乐设?

對于網(wǎng)絡(luò)通訊來說,解決丟數(shù)據(jù)最好的辦法就是绎巨,消息確認機制近尚,而rabbitmq里面是通過兩個方式來保證:一種是事務(wù)機制,這個是在amqp協(xié)議層面保證的场勤,具體操作如下所示:

RabbitMQ中與事務(wù)機制有關(guān)的方法有三個:txSelect(), txCommit()以及txRollback(), txSelect用于將當前channel設(shè)置成transaction模式戈锻,txCommit用于提交事務(wù),txRollback用于回滾事務(wù)和媳,在通過txSelect開啟事務(wù)之后格遭,我們便可以發(fā)布消息給broker代理服務(wù)器了,如果txCommit提交成功了留瞳,則消息一定到達了broker了拒迅,如果在txCommit執(zhí)行之前broker異常崩潰或者由于其他原因拋出異常,這個時候我們便可以捕獲異常通過txRollback回滾事務(wù)了她倘。(備注:采用事務(wù)機制實現(xiàn)會降低RabbitMQ的消息吞吐量璧微。)

步驟為:

1.client----發(fā)送----->Tx.Select

2.broker----發(fā)送----->Tx.Select-Ok(之后publish)

3.client------發(fā)送----->Tx.Commit

4.broker------發(fā)送---->Tx.Commit-Ok

一種是confrim機制:

原理:消息響應(yīng)機制,

生產(chǎn)者將信道設(shè)置成confirm模式硬梁,一旦信道進入confirm模式前硫,所有在該信道上面發(fā)布的消息都會被指派一個唯一的ID(從1開始),一旦消息被投遞到所有匹配的隊列之后荧止,broker就會發(fā)送一個確認給生產(chǎn)者(包含消息的唯一ID),這就使得生產(chǎn)者知道消息已經(jīng)正確到達目的隊列了屹电,如果消息和隊列是可持久化的,那么確認消息會將消息寫入磁盤之后發(fā)出罩息,broker回傳給生產(chǎn)者的確認消息中deliver-tag域包含了確認消息的序列號嗤详。

confrim的優(yōu)勢是,它是異步的瓷炮,在生產(chǎn)者發(fā)送完一個消息之后葱色,不必要等這個消息的返回,就可以繼續(xù)處理另外一個消息娘香,等待消息的ack返回之后苍狰,再去處理前面發(fā)過的消息办龄,類似于多路復用的做法。rabbitmq在收到之后淋昭,會回復ack俐填,如果因為rabbitmq自身的問題導致的,會回復nack消息翔忽。

對于生產(chǎn)者來說英融,為了方便確認消息有沒有真正到達rabbitmq端,還需要在生產(chǎn)者端設(shè)置超時重發(fā)歇式,畢竟網(wǎng)絡(luò)里面是可能丟失消息的驶悟。

confrim方式使用的API:

https://godoc.org/github.com/streadway/amqp#Channel.Confirm

場景2: 消費者從queue中獲取消息如何保證不丟失?

........

詳細參考:灰子學技術(shù) :Rabbitmq如何保證不丟消息


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末材失,一起剝皮案震驚了整個濱河市痕鳍,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌龙巨,老刑警劉巖笼呆,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異旨别,居然都是意外死亡诗赌,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進店門秸弛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來境肾,“玉大人,你說我怎么就攤上這事胆屿“掠鳎” “怎么了?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵非迹,是天一觀的道長环鲤。 經(jīng)常有香客問我,道長憎兽,這世上最難降的妖魔是什么冷离? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮纯命,結(jié)果婚禮上西剥,老公的妹妹穿的比我還像新娘。我一直安慰自己亿汞,他們只是感情好瞭空,可當我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般咆畏。 火紅的嫁衣襯著肌膚如雪南捂。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天旧找,我揣著相機與錄音溺健,去河邊找鬼。 笑死钮蛛,一個胖子當著我的面吹牛鞭缭,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播魏颓,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼缚去,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了琼开?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤枕荞,失蹤者是張志新(化名)和其女友劉穎柜候,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體躏精,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡渣刷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了矗烛。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片辅柴。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖瞭吃,靈堂內(nèi)的尸體忽然破棺而出碌嘀,到底是詐尸還是另有隱情,我是刑警寧澤歪架,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布股冗,位于F島的核電站,受9級特大地震影響和蚪,放射性物質(zhì)發(fā)生泄漏止状。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一攒霹、第九天 我趴在偏房一處隱蔽的房頂上張望怯疤。 院中可真熱鬧,春花似錦催束、人聲如沸集峦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽少梁。三九已至洛口,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間凯沪,已是汗流浹背第焰。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留妨马,地道東北人挺举。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像烘跺,于是被迫代替她去往敵國和親湘纵。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,060評論 2 355