消息隊列的面試題3(轉載)

1朽缴、面試題
如何保證消息不被重復消費安捉摹(如何保證消息消費時的冪等性)可霎?

2、面試官心里分析
其實這個很常見的一個問題宴杀,這倆問題基本可以連起來問癣朗。既然是消費消息,那肯定要考慮考慮會不會重復消費旺罢?能不能避免重復消費旷余?或者重復消費了也別造成系統(tǒng)異尘罴牵可以嗎?這個是MQ領域的基本問題正卧,其實本質上還是問你使用消息隊列如何保證冪等性蠢熄,這個是你架構里要考慮的一個問題。

面試官問你炉旷,肯定是必問的签孔,這是你要考慮的實際生產上的系統(tǒng)設計問題。

3窘行、面試題剖析
回答這個問題饥追,首先你別聽到重復消息這個事兒,就一無所知吧罐盔,你先大概說一說可能會有哪些重復消費的問題但绕。

首先就是比如rabbitmq、rocketmq惶看、kafka壁熄,都有可能會出現消費重復消費的問題,正常碳竟。因為這問題通常不是mq自己保證的,是給你保證的狸臣。然后我們挑一個kafka來舉個例子莹桅,說說怎么重復消費吧。


image.png

kafka實際上有個offset的概念烛亦,就是每個消息寫進去诈泼,都有一個offset,代表他的序號煤禽,然后consumer消費了數據之后铐达,每隔一段時間,會把自己消費過的消息的offset提交一下檬果,代表我已經消費過了瓮孙,下次我要是重啟啥的,你就讓我繼續(xù)從上次消費到的offset來繼續(xù)消費吧选脊。

但是凡事總有意外杭抠,比如我們之前生產經常遇到的,就是你有時候重啟系統(tǒng)恳啥,看你怎么重啟了偏灿,如果碰到點著急的,直接kill進程了钝的,再重啟翁垂。這會導致consumer有些消息處理了铆遭,但是沒來得及提交offset,尷尬了沿猜。重啟之后枚荣,少數消息會再次消費一次。

其實重復消費不可怕邢疙,可怕的是你沒考慮到重復消費之后棍弄,怎么保證冪等性。

給你舉個例子吧疟游。假設你有個系統(tǒng)呼畸,消費一條往數據庫里插入一條,要是你一個消息重復兩次颁虐,你不就插入了兩條蛮原,這數據不就錯了?但是你要是消費到第二次的時候另绩,自己判斷一下已經消費過了儒陨,直接扔了,不就保留了一條數據笋籽?

一條數據重復出現兩次蹦漠,數據庫里就只有一條數據,這就保證了系統(tǒng)的冪等性

冪等性车海,我通俗點說笛园,就一個數據,或者一個請求侍芝,給你重復來多次研铆,你得確保對應的數據是不會改變的,不能出錯州叠。

那所以第二個問題來了棵红,怎么保證消息隊列消費的冪等性?


image.png

其實還是得結合業(yè)務來思考咧栗,我這里給幾個思路:
(1)比如你拿個數據要寫庫逆甜,你先根據主鍵查一下,如果這數據都有了致板,你就別插入了忆绰,update一下好吧

(2)比如你是寫redis,那沒問題了可岂,反正每次都是set错敢,天然冪等性

(3)比如你不是上面兩個場景,那做的稍微復雜一點,你需要讓生產者發(fā)送每條數據的時候稚茅,里面加一個全局唯一的id纸淮,類似訂單id之類的東西,然后你這里消費到了之后亚享,先根據這個id去比如redis里查一下咽块,之前消費過嗎?如果沒有消費過欺税,你就處理侈沪,然后這個id寫redis。如果消費過了晚凿,那你就別處理了亭罪,保證別重復處理相同的消息即可。

還有比如基于數據庫的唯一鍵來保證重復數據不會重復插入多條歼秽,我們之前線上系統(tǒng)就有這個問題应役,就是拿到數據的時候,每次重啟可能會有重復燥筷,因為kafka消費者還沒來得及提交offset箩祥,重復數據拿到了以后我們插入的時候,因為有唯一鍵約束了肆氓,所以重復數據只會插入報錯袍祖,不會導致數據庫中出現臟數據

如何保證MQ的消費是冪等性的,需要結合具體的業(yè)務來看

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末谢揪,一起剝皮案震驚了整個濱河市蕉陋,隨后出現的幾起案子,更是在濱河造成了極大的恐慌键耕,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件柑营,死亡現場離奇詭異屈雄,居然都是意外死亡,警方通過查閱死者的電腦和手機官套,發(fā)現死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門酒奶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人奶赔,你說我怎么就攤上這事惋嚎。” “怎么了站刑?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵另伍,是天一觀的道長。 經常有香客問我,道長摆尝,這世上最難降的妖魔是什么温艇? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮堕汞,結果婚禮上勺爱,老公的妹妹穿的比我還像新娘。我一直安慰自己讯检,他們只是感情好琐鲁,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著人灼,像睡著了一般围段。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上挡毅,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天蒜撮,我揣著相機與錄音,去河邊找鬼跪呈。 笑死段磨,一個胖子當著我的面吹牛,可吹牛的內容都是我干的耗绿。 我是一名探鬼主播苹支,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼误阻!你這毒婦竟也來了债蜜?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤究反,失蹤者是張志新(化名)和其女友劉穎寻定,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體精耐,經...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡狼速,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了卦停。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片向胡。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖惊完,靈堂內的尸體忽然破棺而出僵芹,到底是詐尸還是另有隱情,我是刑警寧澤小槐,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布拇派,位于F島的核電站,受9級特大地震影響,放射性物質發(fā)生泄漏攀痊。R本人自食惡果不足惜桐腌,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望苟径。 院中可真熱鬧案站,春花似錦、人聲如沸棘街。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽遭殉。三九已至石挂,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間险污,已是汗流浹背痹愚。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蛔糯,地道東北人拯腮。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像蚁飒,于是被迫代替她去往敵國和親动壤。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內容