1. 程式人生 > >Kafka如何保證消息的順序性

Kafka如何保證消息的順序性

錯亂 可能 相同 9.png sum info 處理 生產 分享圖片

1. 問題

比如說我們建了一個 topic,有三個 partition。生產者在寫的時候,其實可以指定一個 key,比如說我們指定了某個訂單 id 作為 key,那麽這個訂單相關的數據,一定會被分發到同一個 partition 中去,而且這個 partition 中的數據一定是有順序的。
消費者從 partition 中取出來數據的時候,也一定是有順序的。到這裏,順序還是 ok 的,沒有錯亂。接著,我們在消費者裏可能會搞多個線程來並發處理消息。因為如果消費者是單線程消費處理,而處理比較耗時的話,比如處理一條消息耗時幾十 ms,那麽 1 秒鐘只能處理幾十條消息,這吞吐量太低了。而多個線程並發跑的話,順序可能就亂掉了。

技術分享圖片

2. 解決方案

  • 一個 topic,一個 partition,一個 consumer,內部單線程消費,單線程吞吐量太低,一般不會用這個。
  • 寫 N 個內存 queue,具有相同 key 的數據都到同一個內存 queue;然後對於 N 個線程,每個線程分別消費一個內存 queue 即可,這樣就能保證順序性

技術分享圖片

Kafka如何保證消息的順序性