RabbitMQ 消息可靠性投遞 消息冪等性 有序性

消息可靠性投遞

可靠性投遞需滿足四個(gè)條件:

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

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

3.發(fā)送端收到MQ節(jié)點(diǎn)(Broker)確認(rèn)應(yīng)答

4.完善的消息進(jìn)行補(bǔ)償機(jī)制

臨界值情況:

情況一:生產(chǎn)端投遞消息失敗页衙,消費(fèi)端未收到消息杀怠。

情況二:生產(chǎn)端投遞消息了,消費(fèi)端也收到了吴菠,但在返回應(yīng)答過程中橄教,突然網(wǎng)絡(luò)中斷了導(dǎo)致發(fā)送端未收到確認(rèn)應(yīng)答清寇。

可靠性投遞解決方案

第一種方案:消息落庫,對(duì)消息狀態(tài)進(jìn)行打標(biāo)护蝶。

在發(fā)送消息時(shí)华烟,要將消息持久化到數(shù)據(jù)庫中,然后消息設(shè)置一個(gè)狀態(tài)滓走,如發(fā)送出去垦江,狀態(tài)為0(發(fā)送中),消息到達(dá)broker端搅方,broker端返回響應(yīng)后比吭,將消息狀態(tài)變更為1(消息已成功收到)。

但是姨涡,針對(duì)沒有收到響應(yīng)的消息衩藤,該怎么做?做一個(gè)輪詢操作涛漂,抓取一些沒有OK的消息赏表,設(shè)置最大嘗試次數(shù),進(jìn)行重新發(fā)送匈仗。

第二種方案:消息的延遲投遞瓢剿,做二次確認(rèn),回調(diào)檢查悠轩。

消息落庫方案

1.消息落庫间狂。分為兩個(gè)小步驟,一個(gè)是訂單業(yè)務(wù)數(shù)據(jù)落庫火架,一個(gè)是訂單message落庫鉴象。因此忙菠,第一件事情把訂單業(yè)務(wù)數(shù)據(jù)入庫(創(chuàng)建訂單實(shí)體),第二件事情要生產(chǎn)一條消息纺弊,將message封裝好牛欢,然后把這條消息也要入庫,設(shè)置消息初始狀態(tài)0淆游,表示消息發(fā)送中傍睹。這種方式缺點(diǎn)在于要對(duì)數(shù)據(jù)庫數(shù)據(jù)持久化兩次。這里必須保證這兩步持久化操作成功稽犁,否則立即返回快速失敗焰望。

2.發(fā)送消息給broker

3.假設(shè)broker收到消息,broker將應(yīng)答給生產(chǎn)端已亥。

4.producer端會(huì)有個(gè)Confirm Listener異步的監(jiān)聽broker端返回的響應(yīng)熊赖。如果broker端返回true,監(jiān)聽器監(jiān)聽到true后虑椎,會(huì)將這條指定的消息狀態(tài)更新為1震鹉,表示這條消息已經(jīng)百分之百的投遞成功了。

5.分布式定時(shí)任務(wù)捆姜,處理極端情況传趾。假設(shè)broker端在回送響應(yīng)時(shí),網(wǎng)絡(luò)突然間閃斷泥技,這是MSG DB中這條消息永遠(yuǎn)是初始狀態(tài)0浆兰。這個(gè)時(shí)候需要設(shè)定一個(gè)規(guī)則,設(shè)置一個(gè)臨界值timeout珊豹,比如5分鐘簸呈,如果消息5分鐘之內(nèi)還是初始狀態(tài)0,就需要將這條消息抽取出來店茶,執(zhí)行

6.重新發(fā)送蜕便。或者定時(shí)任務(wù)設(shè)置一個(gè)定時(shí)間隔贩幻,如每隔5分鐘抓取一次status為0的訂單轿腺,這種可能會(huì)出現(xiàn)一個(gè)小問題,消息剛發(fā)出去丛楚,定時(shí)任務(wù)就開始跑了族壳,有一些消息其實(shí)是能ACK成功的,但是分布式定時(shí)任務(wù)又重發(fā)了一遍趣些。所以建議是設(shè)置一個(gè)消息超時(shí)的最大時(shí)間限制仿荆,如5分鐘之內(nèi)這條線消息還沒有收到broker端的響應(yīng),status還是0,這個(gè)時(shí)候赖歌,再去抽取出來,再執(zhí)行第六步重新發(fā)送功茴。第六步:重新發(fā)送

7.設(shè)置最大重試次數(shù)庐冯,超過最大重試次數(shù),將status更新為2表示投遞失敗坎穿。

消息的延遲投遞, 做二次確認(rèn), 回調(diào)檢查

1. 第一次消息發(fā)送消息A必須業(yè)務(wù)數(shù)據(jù)落庫之后才能進(jìn)行消息發(fā)送

2.第二次消息延遲發(fā)送, 設(shè)定延遲一段時(shí)間發(fā)送第二次驗(yàn)證消息B

3.消費(fèi)端監(jiān)聽Broker, 進(jìn)行消息消費(fèi)展父,消費(fèi)消息A

4.消費(fèi)成功之后, 發(fā)送確認(rèn)消息C到確認(rèn)消息隊(duì)列

5. Callback Service監(jiān)聽step4中的確認(rèn)消息隊(duì)列, 接收確認(rèn)消息C,存儲(chǔ)到數(shù)據(jù)庫

6.Callback Service監(jiān)聽step2發(fā)送的Delay Check的消息隊(duì)列, 收到延時(shí)消息B之后玲昧,檢測(cè)數(shù)據(jù)庫是否存儲(chǔ)

7.如果數(shù)據(jù)庫沒有存儲(chǔ)栖茉,重新走該流程

消息冪等性

消息冪等性,其實(shí)就是保證同一個(gè)消息不被消費(fèi)者重復(fù)消費(fèi)兩次孵延。當(dāng)消費(fèi)者消費(fèi)完消息之后吕漂,通常會(huì)發(fā)送一個(gè)ack應(yīng)答確認(rèn)信息給生產(chǎn)者,但是這中間有可能因?yàn)榫W(wǎng)絡(luò)中斷等原因尘应,導(dǎo)致生產(chǎn)者未能收到確認(rèn)消息惶凝,由此這條消息將會(huì)被 重復(fù)發(fā)送給其他消費(fèi)者進(jìn)行消費(fèi),實(shí)際上這條消息已經(jīng)被消費(fèi)過了犬钢,這就是重復(fù)消費(fèi)的問題苍鲜。

實(shí)現(xiàn)消息冪等性

消息全局ID或者寫個(gè)唯一標(biāo)識(shí)(如時(shí)間戳、UUID等) :每次消費(fèi)消息之前根據(jù)消息id去判斷該消息是否已消費(fèi)過玷犹,如果已經(jīng)消費(fèi)過混滔,則不處理這條消息,否則正常消費(fèi)消息歹颓,并且進(jìn)行入庫操作坯屿。(消息全局ID作為數(shù)據(jù)庫表的主鍵,防止重復(fù))

利用Redis的分布式鎖:給消息分配一個(gè)全局ID晴股,只要消費(fèi)過該消息愿伴,將 < id,message>寫入redis,消費(fèi)者開始消費(fèi)前电湘,先去redis中查詢有沒消費(fèi)記錄即可隔节。

消息有序性

RabbitMQ在2.7.0及之后版本支持【同發(fā)送信道、同exchange寂呛、同queue怎诫、同消費(fèi)信道的消息順序與發(fā)送順序相同】

一句話總結(jié):單一生產(chǎn)者、單一隊(duì)列贷痪、單一消費(fèi)進(jìn)程是可以保障有序的幻妓,其他不保證

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市劫拢,隨后出現(xiàn)的幾起案子肉津,更是在濱河造成了極大的恐慌强胰,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件妹沙,死亡現(xiàn)場(chǎng)離奇詭異偶洋,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)距糖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門玄窝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人悍引,你說我怎么就攤上這事恩脂。” “怎么了趣斤?”我有些...
    開封第一講書人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵俩块,是天一觀的道長。 經(jīng)常有香客問我唬渗,道長典阵,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任镊逝,我火速辦了婚禮壮啊,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘撑蒜。我一直安慰自己歹啼,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開白布座菠。 她就那樣靜靜地躺著狸眼,像睡著了一般。 火紅的嫁衣襯著肌膚如雪浴滴。 梳的紋絲不亂的頭發(fā)上拓萌,一...
    開封第一講書人閱讀 52,457評(píng)論 1 311
  • 那天,我揣著相機(jī)與錄音升略,去河邊找鬼微王。 笑死,一個(gè)胖子當(dāng)著我的面吹牛品嚣,可吹牛的內(nèi)容都是我干的炕倘。 我是一名探鬼主播,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼翰撑,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼罩旋!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤涨醋,失蹤者是張志新(化名)和其女友劉穎瓜饥,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體浴骂,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡压固,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了靠闭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡坎炼,死狀恐怖愧膀,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情谣光,我是刑警寧澤檩淋,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站萄金,受9級(jí)特大地震影響蟀悦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜氧敢,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一日戈、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧孙乖,春花似錦浙炼、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至恋拷,卻和暖如春资厉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蔬顾。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來泰國打工宴偿, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人阎抒。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓酪我,卻偏偏與公主長得像,于是被迫代替她去往敵國和親且叁。 傳聞我的和親對(duì)象是個(gè)殘疾皇子都哭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360

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