rabbitmq保證消息可靠 消息不丟失

三端可靠

  1. 發(fā)送方和mq保證消息送達到mq
  2. mq保證保存的消息不丟失
  3. 消費方和mq一起保證消息被成功消費

發(fā)送方和mq保證消息送達到mq

方案一挤渔、rabbitmq如果是用spring boot提供的模版接口發(fā)送 需要調(diào)用rabbitTemplate.convertSendAndReceive()方法發(fā)送 這個是當消息成功到隊列了才會返回結(jié)果 如果失敗則會拋異常 不過這就會導致等待時間比較長 適合高可靠場景
不過一般在業(yè)務開發(fā)都是完成業(yè)務以后再發(fā)消息 比如插入訂單表一筆訂單 發(fā)送訂單創(chuàng)建的消息 這兩步是需要保證原子性的 要么都成功要么都失敗 rabbitmq支持事務消息 不過如果出現(xiàn)下面情況

  • 開啟事務
  • 插入訂單表
  • 發(fā)送mq消息
  • 提交數(shù)據(jù)庫事務成功
  • 提交mq事務失敗
  • 消息丟失

所以如果是用rabbitmq的事務消息來做 其實在極端情況是會丟失消息的 在這里可以采用一個異步命令組件提供的方案https://github.com/bojiw/asyncmd

  • 開啟事務
  • 插入訂單表
  • 插入異步命令表
  • 提交數(shù)據(jù)庫事務
  • 線程掃描異步命令表撈取消息
  • 通過rabbitTemplate.convertSendAndReceive()方法發(fā)送
  • 如果失敗 則重試 并且報警

方案二卧波、如采用rabbitTemplate.convertAndSend和confirms(消費回調(diào))加Return(錯誤回調(diào))模式

  • convertAndSend 發(fā)送到mq 立刻返回 不管交換機是否成功處理 所以并發(fā)會高
  • confirms(消費回調(diào)) 實現(xiàn)接口ConfirmCallback 消息成功發(fā)送到rabbitmq交換機上則會回調(diào)接口 入?yún)ck為true代表成功發(fā)送到交換機 false代表異常
  • Return(錯誤回調(diào)) 實現(xiàn)接口ReturnCallback 消息從交換機到隊列 成功不會回調(diào) 如果發(fā)送到隊列失敗 則會調(diào)用回調(diào)

上面這種方式如果在回調(diào)中處理消息發(fā)送失敗的邏輯時出現(xiàn)異陈饽校或者應用服務器掛了 則會導致消息丟失 因為只會回調(diào)一次
這種情況可以采用加一張消息表 先插入消息表 然后掃表發(fā)送消息 confirms回調(diào)成功 則更新表狀態(tài) 如果回調(diào)的時候異常 則消息表會重新發(fā)送 這種就會出現(xiàn)消息重發(fā)的情況 不過一般消息消費者都要保證冪等 所以這個問題不大 不過如果出現(xiàn)以下情況

  • 數(shù)據(jù)庫有兩個字段 confirms默認0 和 return 默認0
  • 回調(diào)成功confirms=1 回調(diào)失敗confirms=2 錯誤回調(diào)return=2
  • 當回調(diào)成功 confirms=1 錯誤回調(diào)處理失敗沒有成功更新表 則return還是0
  • 這個時候你掃表就不確定需不需要重發(fā)消息 因為如果消息成功到隊列 表的狀態(tài)也是confirms=1 return=0
  • 無法對發(fā)送隊列成功和發(fā)送隊列失敗可在回調(diào)異常這兩種情況做區(qū)分

這里邏輯就會出問題 所以只能處理消息成功到交換機 是否到隊列則不管 因為一般都是成功的 除了極端情況 比如隊列被人誤刪除
方案二和方案一其實從整個流程來講 發(fā)送消息速度其實差不多的 不過可靠性還是方案一高一點

mq保證保存的消息不丟失

消息、交換機夭谤、隊列都需要設置持久化

消費方和mq一起保證消息被成功消費

消費者開啟手動確認

acknowledge="manual"

在業(yè)務代碼里 成功處理業(yè)務 才返回給rabbitmq消費成功的確認

channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);

如果業(yè)務處理失敗則重新放到隊列重新消費

channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, true);

由消費者 只有業(yè)務成功處理才進行ack 記得需要做好冪等
不過這里rabbitmq在重試這塊沒有做好 如果不確定會一直重試 如果因為依賴的一個系統(tǒng)掛了 要一個小時以后才會啟動成功 在這一個小時里會一直重試 這就會對rabbitmq和消費者帶來一定的壓力 這塊也可以采用異步命令組件提供的方案https://github.com/bojiw/asyncmd

  • 接收消息
  • 把消息插入異步命令
  • 返回rabbitmq成功
  • 異步組件執(zhí)行業(yè)務邏輯
  • 調(diào)用接口失敗重試
  • 重試一定次數(shù)則不重試 由人工進行處理 也可以把重試間隔設置的長一點 比如前三次每隔1s重試 第四次隔一個小時重試
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末棺牧,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子朗儒,更是在濱河造成了極大的恐慌颊乘,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件醉锄,死亡現(xiàn)場離奇詭異乏悄,居然都是意外死亡,警方通過查閱死者的電腦和手機恳不,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進店門檩小,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人烟勋,你說我怎么就攤上這事规求。” “怎么了卵惦?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵阻肿,是天一觀的道長。 經(jīng)常有香客問我沮尿,道長丛塌,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任畜疾,我火速辦了婚禮赴邻,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘庸疾。我一直安慰自己乍楚,他們只是感情好,可當我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布届慈。 她就那樣靜靜地躺著徒溪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪金顿。 梳的紋絲不亂的頭發(fā)上臊泌,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天,我揣著相機與錄音揍拆,去河邊找鬼渠概。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的播揪。 我是一名探鬼主播贮喧,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼猪狈!你這毒婦竟也來了箱沦?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤雇庙,失蹤者是張志新(化名)和其女友劉穎谓形,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體疆前,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡寒跳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了竹椒。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片童太。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖碾牌,靈堂內(nèi)的尸體忽然破棺而出康愤,到底是詐尸還是另有隱情,我是刑警寧澤舶吗,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布征冷,位于F島的核電站,受9級特大地震影響誓琼,放射性物質(zhì)發(fā)生泄漏检激。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一腹侣、第九天 我趴在偏房一處隱蔽的房頂上張望叔收。 院中可真熱鬧,春花似錦傲隶、人聲如沸饺律。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽复濒。三九已至,卻和暖如春乒省,著一層夾襖步出監(jiān)牢的瞬間巧颈,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人棚品。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓久橙,卻偏偏與公主長得像,于是被迫代替她去往敵國和親悟衩。 傳聞我的和親對象是個殘疾皇子苍苞,可洞房花燭夜當晚...
    茶點故事閱讀 44,779評論 2 354

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