消息隊列把消息弄丟了怎么辦淹接?

消息隊列會丟失消息嗎?

答案是肯定的叛溢,所以對于業(yè)務(wù)嚴(yán)謹(jǐn)?shù)臄?shù)據(jù)塑悼,我們要確保其在消息隊列中的安全,不能丟楷掉。

要想解決不丟的問題厢蒜,首先要弄清楚 消息是怎么丟的呢?

丟消息的關(guān)鍵點有3個:

  • Producer 發(fā)送消息的過程
  • 消息隊列的消息存儲
  • Consumer 消費消息的過程

下面挨個看看都是怎么丟的烹植,以及解決方案斑鸦。

會以 RabbitMQ 和 Kafka 這兩個常用的消息系統(tǒng)來說明。

1. Producer 弄丟消息

Producer 向 MQ 發(fā)消息草雕,很簡單巷屿,發(fā)過去就完事兒了。

但是墩虹,在發(fā)送圖中是存在危險的嘱巾,例如網(wǎng)絡(luò)問題等等,導(dǎo)致 MQ 沒有正常收到诫钓。

image

怎么解決呢旬昭? 思路很簡單,讓 MQ 發(fā)一個 接受確認(rèn)聲明(ack) 就行了尖坤,就像快遞需要簽收一樣稳懒。

例如 RabbitMQ闲擦,有兩種方式可以確保發(fā)送消息的安全慢味。

1)事務(wù)消息

Producer 發(fā)送消息之前,先開啟事務(wù)墅冷,然后再發(fā)送纯路。

如果 RabbitMQ 沒有正常收到消息,Producer 會收到異常信息寞忿,回滾事務(wù)驰唬。

如果正常接收了,Producer 就提交事務(wù)。

很可靠叫编,但效率低辖佣,因為這個事務(wù)模式是同步的,會產(chǎn)生阻塞搓逾。

2)confirm 確認(rèn)模式

Producer 開啟 confirm 模式卷谈,發(fā)送消息的時候,RabbitMQ 會給這個消息分配一個唯一的 ID霞篡。

成功寫入隊列之后世蔗,RabbitMQ 會向 Producer 發(fā)送一個 ack 消息,說明此 ID 的消息已經(jīng)成功發(fā)送朗兵。

confirm 模式還有一個回調(diào)機(jī)制污淋,Producer 可以準(zhǔn)備一個失敗的接口,供 RabbitMQ 在接收失敗時調(diào)用余掖。

Producer 收到失敗通知寸爆,或者超時了,可以執(zhí)行相應(yīng)的處理邏輯盐欺,例如重發(fā)而昨。

confirm 模式是異步的,比事務(wù)消息更高效找田,使用更為廣泛歌憨。

Kafka 也是使用的 ack 方式,使用方式很簡單墩衙,只要配置:

ack=all

確保 Kafka 在完全接收成功后才發(fā)送確認(rèn)通知务嫡,這樣就一定不會發(fā)丟了。

2. MQ 在存儲期間弄丟消息

MQ 成功接收消息之后漆改,需要保存起來心铃,等著 Consumer 消費。

在這個保存期間挫剑,也可以能丟失消息去扣。

這通常是由 MQ 故障引起的。

RabbitMQ 想要保障消息不丟樊破,需要開啟持久化愉棱,消息就會寫入磁盤。

即使 RabbitMQ 宕機(jī)了哲戚,只要磁盤沒事兒奔滑,重啟之后還可以重新把消息加載進(jìn)來。

如果想進(jìn)一步的保障消息安全顺少,就需要配置 RabbitMQ 的鏡像集群了朋其,來確保高可用王浴。

Kafka 是天然的分布式系統(tǒng),Topic 分為多個 Partition梅猿,每個 Partition 又有多個副本氓辣。

image

Partition 的多個副本,分為 Leader 和 Follower袱蚓。

Leader 負(fù)責(zé)處理消息的讀寫筛婉,F(xiàn)ollower 負(fù)責(zé)備份。

前面說的 Kafka 配置 ack=all癞松,就是告訴Kafka爽撒,Leader 和所有 Follower 全都接收到了,才算發(fā)送 ack 確認(rèn)响蓉,只有 Leader 自己接收成功是不算的硕勿。

否則的話,如果 Leader 接收完成就告訴 Producer OK 了枫甲,在 Leader 同步給 Follower 之前源武,Leader 宕機(jī)了,Kafka 會從 Follower 中選舉出新的 Leader想幻。那么粱栖,老 Leader 在臨終前沒有同步的消息就丟失了。

為了保障消息的安全脏毯,這 4 個參數(shù)要設(shè)置好:

replication.factor

用于指定 Partition 副本的數(shù)量闹究,必須大于 1,就是至少要有 2 個副本食店,一個 Leader 一個 Follower渣淤。

min.insync.replicas

用于指定幾個副本成功寫入才提交消息,只有提交之后的消息才能被 Consumer 消費吉嫩。

此值至少大于 1价认,這樣就保障 Leader 之外至少有一個副本同步到了這條消息,不怕 Leader 宕掉了自娩。

acks=all

用于指定幾個副本接收到消息之后向 Producer 發(fā)送 ack用踩。例如值為 1,表示 Leader 收到就可以了忙迁,“all” 表示 “所有副本”脐彩,也可以寫 “-1”,等同于 “all”动漾。

retries=999

用于指定 Producer 發(fā)送失敗后的重試次數(shù)丁屎,可以設(shè)為一個很大的數(shù)荠锭,表示失敗了就重試旱眯,提升發(fā)送成功幾率。

3. Consumer 弄丟消息

image

例如 Consumer 成功接收到了消息 “123”,MQ 就會移除這條消息删豺。

但在 Consumer 處理完這條消息之前共虑,宕機(jī)了。

image

Consumer 重啟之后繼續(xù)從 MQ 拿消息呀页,這次拿到的就是下一條消息 “124”妈拌,那么 “123” 就丟了。

所以蓬蝶,Consumer 只是接收到消息是不夠的尘分,成功處理完成才行。

這就和 MQ 的消費確認(rèn)機(jī)制有關(guān)了丸氛。

RabbitMQ 默認(rèn)是 Consumer 成功接收消息之后就發(fā)送 ack 確認(rèn)培愁,RabbitMQ 就認(rèn)為消費成功了。

關(guān)閉自動的 Consumer ack 就行缓窜,改為手動發(fā)送確認(rèn)通知定续。

Kafka 的 Consumer 發(fā)送的不是 ack 確認(rèn),而是 offset禾锤,告訴 Kafka 已經(jīng)消費到哪個位置了私股。

默認(rèn)是 Consumer 接收后自動提交 offset,所以也需要關(guān)閉恩掷,改為手動提交倡鲸。

小結(jié)一下,要想消息不丟黄娘,需要發(fā)消息的時候確認(rèn)發(fā)送成功了旦签,MQ 存儲的時候要是高可靠的,Consumer 消費的時候寸宏,不能接收之后就確認(rèn)宁炫,真正處理完成才行。

推薦閱讀

OAuth2 圖解

輕松理解 Kubernetes 的核心概念

開發(fā)者必須要了解的架構(gòu)技術(shù)趨勢:Service Mesh

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末氮凝,一起剝皮案震驚了整個濱河市羔巢,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌罩阵,老刑警劉巖竿秆,帶你破解...
    沈念sama閱讀 206,013評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異稿壁,居然都是意外死亡幽钢,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評論 2 382
  • 文/潘曉璐 我一進(jìn)店門傅是,熙熙樓的掌柜王于貴愁眉苦臉地迎上來匪燕,“玉大人蕾羊,你說我怎么就攤上這事∶毖保” “怎么了龟再?”我有些...
    開封第一講書人閱讀 152,370評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長尼变。 經(jīng)常有香客問我利凑,道長,這世上最難降的妖魔是什么嫌术? 我笑而不...
    開封第一講書人閱讀 55,168評論 1 278
  • 正文 為了忘掉前任哀澈,我火速辦了婚禮,結(jié)果婚禮上度气,老公的妹妹穿的比我還像新娘日丹。我一直安慰自己,他們只是感情好蚯嫌,可當(dāng)我...
    茶點故事閱讀 64,153評論 5 371
  • 文/花漫 我一把揭開白布哲虾。 她就那樣靜靜地躺著,像睡著了一般择示。 火紅的嫁衣襯著肌膚如雪束凑。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,954評論 1 283
  • 那天栅盲,我揣著相機(jī)與錄音汪诉,去河邊找鬼。 笑死谈秫,一個胖子當(dāng)著我的面吹牛扒寄,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播拟烫,決...
    沈念sama閱讀 38,271評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼该编,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了硕淑?” 一聲冷哼從身側(cè)響起课竣,我...
    開封第一講書人閱讀 36,916評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎置媳,沒想到半個月后于樟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,382評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡拇囊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,877評論 2 323
  • 正文 我和宋清朗相戀三年迂曲,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片寥袭。...
    茶點故事閱讀 37,989評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡路捧,死狀恐怖关霸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情鬓长,我是刑警寧澤谒拴,帶...
    沈念sama閱讀 33,624評論 4 322
  • 正文 年R本政府宣布尝江,位于F島的核電站涉波,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏炭序。R本人自食惡果不足惜啤覆,卻給世界環(huán)境...
    茶點故事閱讀 39,209評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望惭聂。 院中可真熱鬧窗声,春花似錦、人聲如沸辜纲。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽耕腾。三九已至见剩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間扫俺,已是汗流浹背苍苞。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留狼纬,地道東北人羹呵。 一個月前我還...
    沈念sama閱讀 45,401評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像疗琉,于是被迫代替她去往敵國和親冈欢。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,700評論 2 345

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