RabbitMQ 100% 投遞成功方案詳解

一. 生產(chǎn)端的可靠性投遞

1. 保障消息的成功發(fā)出

2. 保障MQ節(jié)點的成功接收

3. 發(fā)送端收到MQ節(jié)點(broker)確認應(yīng)答

4. 完善的消息補償機制

在實際生產(chǎn)中箭窜,很難保障前三點的完全可靠靶壮,比如在極端的環(huán)境中,生產(chǎn)者發(fā)送消息失敗了坪创,發(fā)送端在接受確認應(yīng)答時突然發(fā)生網(wǎng)絡(luò)閃斷等等情況又碌,很難保障可靠性投遞,所以就需要有第四點完善的消息補償機制兜粘。

二袖扛、互聯(lián)網(wǎng)大廠的解決方案

第一種:消息落庫砸泛,對消息狀態(tài)進行達標(biāo)十籍。具體來說就是將消息持久化到數(shù)據(jù)庫并設(shè)置狀態(tài)值蛆封,收到消費端的應(yīng)答就改變當(dāng)前記錄的狀態(tài)。再用輪詢?nèi)ブ匦掳l(fā)送沒接收到應(yīng)答的消息勾栗,注意這里要設(shè)置重試次數(shù)惨篱。

第二種:消息的延遲投遞,做二次確認围俘,回調(diào)檢查砸讳。

三、消息落庫界牡,對消息狀態(tài)進行打標(biāo)

消息落庫的流程圖

image

流程的示意圖如上所示簿寂,比如我下單成功了,這是進行 step1宿亡,對我的業(yè)務(wù)數(shù)據(jù)進行入庫常遂,業(yè)務(wù)數(shù)據(jù)入庫完畢(這里要特別注意一定要保證業(yè)務(wù)數(shù)據(jù)入庫)再對要發(fā)送的消息進行入庫,圖中采用了兩個數(shù)據(jù)庫挽荠,可以根據(jù)實際業(yè)務(wù)場景來確定是否采用兩個數(shù)據(jù)庫克胳,如果采用了兩個數(shù)據(jù)庫,有人可能就像到了采用分布式事務(wù)來保證數(shù)據(jù)的一致性圈匆,但是在大型互聯(lián)網(wǎng)中漠另,基本很少采用事務(wù),都是采用補償機制跃赚。對業(yè)務(wù)數(shù)據(jù)和消息入庫完畢就進入 setp2笆搓,發(fā)送消息到 MQ 服務(wù)上,按照正常的流程就是消費者監(jiān)聽到該消息,就根據(jù)唯一 id 修改該消息的狀態(tài)為已消費满败,并給一個確認應(yīng)答 ack 到 Listener窘奏。如果出現(xiàn)意外情況,消費者未接收到或者 Listener 接收確認時發(fā)生網(wǎng)絡(luò)閃斷葫录,接收不到着裹,這時候就需要用到我們的分布式定時任務(wù)來從 msg 數(shù)據(jù)庫抓取那些超時了還未被消費的消息,重新發(fā)送一遍米同。重試機制里面要設(shè)置重試次數(shù)限制骇扇,因為一些外部的原因?qū)е乱恢卑l(fā)送失敗的,不能重試太多次面粮,要不然會拖垮整個服務(wù)少孝。例如重試三次還是失敗的,就把消息的 status 設(shè)置成 2熬苍,然后通過補償機制稍走,人工去處理。實際生產(chǎn)中柴底,這種情況還是比較少的婿脸,但是你不能沒有這個補償機制,要不然就做不到可靠性了柄驻。

四狐树、延遲投遞,做二次確認鸿脓,回調(diào)檢查抑钟。

回想第一種方案,生產(chǎn)端既要對業(yè)務(wù)數(shù)據(jù)入庫野哭,又要對消息數(shù)據(jù)入庫在塔,這種設(shè)計在高并發(fā)場景下,真的合適嗎拨黔?在核心鏈路上蛔溃,每一次持久化都是需要很精心考量的,持久化一次就花費 100 - 200 毫秒蓉驹,這在高并發(fā)場景下是忍受不了的城榛。這時候需要我們的第二種方案了,流程圖如下态兴。

image

upstream Server 就是我們的上游服務(wù)狠持,也就是生產(chǎn)者,生產(chǎn)者將業(yè)務(wù)數(shù)據(jù)入庫成功后瞻润,生成兩條消息喘垂,一條是立即發(fā)送出去給到下游服務(wù) downstream Server的甜刻,一條是延遲消息給到 補償服務(wù) callback Server的。

正常情況下正勒,下游服務(wù)監(jiān)聽到這個即時的消息得院,會發(fā)送一條消息給到 callback Server,注意這里不是采用第一種方案里面的返回 ack 方式章贞,而是發(fā)送了一條消息給回去祥绞。

callback Server 監(jiān)聽到這個消息,知道了剛才有一條消息消費成功了鸭限,然后把這個持久化到數(shù)據(jù)庫中蜕径,當(dāng)上游服務(wù)發(fā)送的延遲消息到達 callback Server 時,callback Server 就會去數(shù)據(jù)庫查詢败京,剛才下游服務(wù)是否有處理過這個對應(yīng)的消息兜喻,如果其 msg DB 里面有這個記錄就說明這條消息是已經(jīng)被消費了,如果不存在這個記錄赡麦,那么 callback Server 就會發(fā)起一個 RPC 請求給到上游服務(wù)朴皆,告訴上游服務(wù),你剛才這個消息沒發(fā)送成功泛粹,需要重新發(fā)送一遍遂铡,上游服務(wù)就重新發(fā)送即時和延遲的兩條消息出去,按照之前的流程繼續(xù)走一遍戚扳。

雖然第二種方案也是無法做到 100% 的可靠傳遞忧便,在特別極端的情況族吻,還是需要定時任務(wù)和補償機制進行輔助的帽借。但是第二種方案的核心是減少數(shù)據(jù)庫操作,這個點很重要超歌!

在高并發(fā)場景下砍艾,我考慮的不是百分百的可靠性了,而是考慮可用性巍举,性能能否扛得住這個流量脆荷,所以我能減少一次數(shù)據(jù)庫操作就減少一次。我上游服務(wù)減少了一次數(shù)據(jù)庫操作懊悯,我的服務(wù)性能相對而言就提高了一些蜓谋,而且又能把異步 callback Server 補償服務(wù)解耦出來。

五炭分、結(jié)論

這兩種方案都是可行的桃焕,需要根據(jù)實際業(yè)務(wù)來進行選擇,大型的超高并發(fā)的場景會選擇第二種方案捧毛,普通的就采用第一種即可观堂。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末让网,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子师痕,更是在濱河造成了極大的恐慌溃睹,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,430評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件胰坟,死亡現(xiàn)場離奇詭異因篇,居然都是意外死亡,警方通過查閱死者的電腦和手機笔横,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評論 3 398
  • 文/潘曉璐 我一進店門惜犀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人狠裹,你說我怎么就攤上這事虽界。” “怎么了涛菠?”我有些...
    開封第一講書人閱讀 167,834評論 0 360
  • 文/不壞的土叔 我叫張陵莉御,是天一觀的道長。 經(jīng)常有香客問我俗冻,道長礁叔,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,543評論 1 296
  • 正文 為了忘掉前任迄薄,我火速辦了婚禮琅关,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘讥蔽。我一直安慰自己涣易,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,547評論 6 397
  • 文/花漫 我一把揭開白布冶伞。 她就那樣靜靜地躺著新症,像睡著了一般。 火紅的嫁衣襯著肌膚如雪响禽。 梳的紋絲不亂的頭發(fā)上徒爹,一...
    開封第一講書人閱讀 52,196評論 1 308
  • 那天,我揣著相機與錄音芋类,去河邊找鬼隆嗅。 笑死,一個胖子當(dāng)著我的面吹牛侯繁,可吹牛的內(nèi)容都是我干的胖喳。 我是一名探鬼主播,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼巫击,長吁一口氣:“原來是場噩夢啊……” “哼禀晓!你這毒婦竟也來了精续?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,671評論 0 276
  • 序言:老撾萬榮一對情侶失蹤粹懒,失蹤者是張志新(化名)和其女友劉穎重付,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體凫乖,經(jīng)...
    沈念sama閱讀 46,221評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡确垫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,303評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了帽芽。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片删掀。...
    茶點故事閱讀 40,444評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖导街,靈堂內(nèi)的尸體忽然破棺而出披泪,到底是詐尸還是另有隱情,我是刑警寧澤搬瑰,帶...
    沈念sama閱讀 36,134評論 5 350
  • 正文 年R本政府宣布款票,位于F島的核電站,受9級特大地震影響泽论,放射性物質(zhì)發(fā)生泄漏艾少。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,810評論 3 333
  • 文/蒙蒙 一翼悴、第九天 我趴在偏房一處隱蔽的房頂上張望缚够。 院中可真熱鬧,春花似錦鹦赎、人聲如沸谍椅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽毯辅。三九已至,卻和暖如春煞额,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背沾谜。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評論 1 272
  • 我被黑心中介騙來泰國打工膊毁, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人基跑。 一個月前我還...
    沈念sama閱讀 48,837評論 3 376
  • 正文 我出身青樓婚温,卻偏偏與公主長得像,于是被迫代替她去往敵國和親媳否。 傳聞我的和親對象是個殘疾皇子栅螟,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,455評論 2 359

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

  • 一. 生產(chǎn)端的可靠性投遞 1. 保障消息的成功發(fā)出 2. 保障MQ節(jié)點的成功接收 3. 發(fā)送端收到MQ節(jié)點(bro...
    Java機械師閱讀 832評論 0 9
  • 一. 生產(chǎn)端的可靠性投遞 在實際生產(chǎn)中荆秦,很難保障前三點的完全可靠,比如在極端的環(huán)境中力图,生產(chǎn)者發(fā)送消息失敗了步绸,發(fā)送...
    HmilyMing閱讀 1,521評論 3 43
  • 什么是生產(chǎn)端的可靠性投遞? 保障消息的成功發(fā)出 保障MQ節(jié)點的成功接收 發(fā)送端收到MQ節(jié)點(Broker) 確認應(yīng)...
    若兮緣閱讀 3,321評論 1 33
  • 一吃媒、消息如何保證 100% 的投遞成功瓤介? 投遞主要針對生產(chǎn)端,什么是生產(chǎn)端的可靠性投遞赘那? 保障消息成功的發(fā)出去 保...
    匆匆歲月閱讀 1,823評論 0 19
  • 投遞主要針對生產(chǎn)端刑桑,什么是生產(chǎn)端的可靠性投遞? 保障消息成功的發(fā)出去 保證MQ節(jié)點成功收到消息 發(fā)送端收到MQ的確...
    Real_man閱讀 6,840評論 3 37