消息隊列如何確保消息的有序性衔统?

要想實現消息有序,需要從 Producer 和 Consumer 兩方面來考慮海雪。

首先锦爵,Producer 生產消息的時候就必須要有序。

然后喳魏,Consumer 消費的時候棉浸,也要按順序來怀薛,不能亂刺彩。

Producer 有序

image

像 RabbitMQ 這類普通的消息系統(tǒng),隊列結構簡單,Producer 向隊列中發(fā)送消息就完了创倔,進入隊列的消息肯定是有序的嗡害。

image

Kafka 比較特殊,因為它的一個 Topic(就是隊列的概念)實際上分為了多個 Partition畦攘。

Producer 發(fā)送消息的時候霸妹,是分散在不同 Partition 的。

Producer 按順序發(fā)消息知押,但進入 Kafka Topic 之后叹螟,這些消息就不一定進到哪個 Partition 了,所以順序肯定是亂的台盯。

image

如果想 Topic 內的消息全局有序罢绽,就只能設置一個 Partition 了,這就變成了 RabbitMQ 那種結構静盅。

但這種結構不符合 Kafka 的設計理念良价,Topic 只有一個 Partition 就失去了擴展性。

image

kafka 還支持一種局部有序的方式蒿叠,就是把某一類的消息都放入同一個 Partition明垢,就保證了這組消息的順序。

在發(fā)消息的時候指定 Partition Key市咽,Kafka 對其進行 Hash 計算痊银,根據計算結果決定放入哪個 Partition。

所以魂务,Partition Key 一樣的消息肯定是在一起的曼验。

例如使用用戶 ID 做 key,這樣同一個用戶的消息肯定是在一起的粘姜,就保證了這一組的消息的有序鬓照。

Consumer 有序

MQ 內消息有序,那么 Consumer 自然也是按順序接收的。

但是帘靡,如果使用了多個 Consumer斧蜕,就可能出現亂序。

image

例如 RabbitMQ 的一個 Queue 有 3個 Consumer臭猜,雖然會按順序接收到消息,但是它們各自的處理速度是不同的押蚤,所以蔑歌,出來的結果很可能是亂序的。

如果想嚴格按順序來揽碘,就只能使用一個 Consumer次屠。

如果可以使用局部有序园匹,那么就把之前的一個隊列拆為多個隊列,就像 Kafka 的 Partition Key 一樣劫灶,把同組數據放入同一個隊列裸违。

image

Kafka 中一個 Partition 只能對應一個 Consumer,但如果 Consumer 使用了多線程本昏,就和多個 Consumer 一個效果了供汛,還是會造成亂序。

這樣的話就需要進一步細化消息的分組涌穆。

image

為每個線程創(chuàng)建一個內存隊列怔昨,Consumer 收到消息后,把同組的消息都放在同一個內存隊列宿稀,由同一個線程處理即可朱监。

小結一下,消息的有序需要 Producer 和 Consumer 都有序原叮。

RabbitMQ 的隊列結構簡單赫编,Producer 發(fā)送的消息是有序的。但 Kafka 特殊奋隶,一個 Topic 有多個 Partition擂送,如果要求全局有序,就只能使用一個 Partition唯欣。

如果可以接受局部有序嘹吨,就可以為消息設置 Partition Key,其 Hash 計算結果相同的消息都會在同一個 Partition境氢。

Consumer 消費時需要注意多 Consumer 的情況蟀拷,例如多個消費線程。

可以在 Consumer 收到消息后再細化分組萍聊,同組的消息交給同一個消費線程處理问芬。

推薦閱讀

OAuth2 圖解

輕松理解 Kubernetes 的核心概念

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

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市寿桨,隨后出現的幾起案子此衅,更是在濱河造成了極大的恐慌,老刑警劉巖亭螟,帶你破解...
    沈念sama閱讀 206,013評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件挡鞍,死亡現場離奇詭異,居然都是意外死亡预烙,警方通過查閱死者的電腦和手機墨微,發(fā)現死者居然都...
    沈念sama閱讀 88,205評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來扁掸,“玉大人翘县,你說我怎么就攤上這事衰琐。” “怎么了炼蹦?”我有些...
    開封第一講書人閱讀 152,370評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長狸剃。 經常有香客問我掐隐,道長,這世上最難降的妖魔是什么钞馁? 我笑而不...
    開封第一講書人閱讀 55,168評論 1 278
  • 正文 為了忘掉前任虑省,我火速辦了婚禮,結果婚禮上僧凰,老公的妹妹穿的比我還像新娘探颈。我一直安慰自己,他們只是感情好训措,可當我...
    茶點故事閱讀 64,153評論 5 371
  • 文/花漫 我一把揭開白布伪节。 她就那樣靜靜地躺著,像睡著了一般绩鸣。 火紅的嫁衣襯著肌膚如雪怀大。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,954評論 1 283
  • 那天呀闻,我揣著相機與錄音化借,去河邊找鬼。 笑死捡多,一個胖子當著我的面吹牛蓖康,可吹牛的內容都是我干的。 我是一名探鬼主播垒手,決...
    沈念sama閱讀 38,271評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼蒜焊,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了科贬?” 一聲冷哼從身側響起山涡,我...
    開封第一講書人閱讀 36,916評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎唆迁,沒想到半個月后鸭丛,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 43,382評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡唐责,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,877評論 2 323
  • 正文 我和宋清朗相戀三年鳞溉,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鼠哥。...
    茶點故事閱讀 37,989評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡熟菲,死狀恐怖看政,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情抄罕,我是刑警寧澤允蚣,帶...
    沈念sama閱讀 33,624評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站呆贿,受9級特大地震影響嚷兔,放射性物質發(fā)生泄漏。R本人自食惡果不足惜做入,卻給世界環(huán)境...
    茶點故事閱讀 39,209評論 3 307
  • 文/蒙蒙 一冒晰、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧竟块,春花似錦壶运、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至耸携,卻和暖如春恕出,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背违帆。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評論 1 260
  • 我被黑心中介騙來泰國打工浙巫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人刷后。 一個月前我還...
    沈念sama閱讀 45,401評論 2 352
  • 正文 我出身青樓的畴,卻偏偏與公主長得像,于是被迫代替她去往敵國和親尝胆。 傳聞我的和親對象是個殘疾皇子丧裁,可洞房花燭夜當晚...
    茶點故事閱讀 42,700評論 2 345

推薦閱讀更多精彩內容