1. 問題
比如說我們建了一個 topic,有三個 partition。生產者在寫的時候,其實可以指定一個 key,比如說我們指定了某個訂單 id 作為 key,那么這個訂單相關的數據,一定會被分發到同一個 partition 中去,而且這個 partition 中的數據一定是有順序的。
消費者從 partition 中取出來數據的時候,也一定是有順序的。到這里,順序還是 ok 的,沒有錯亂。接着,我們在消費者里可能會搞多個線程來並發處理消息。因為如果消費者是單線程消費處理,而處理比較耗時的話,比如處理一條消息耗時幾十 ms,那么 1 秒鍾只能處理幾十條消息,這吞吐量太低了。而多個線程並發跑的話,順序可能就亂掉了。
2. 解決方案
- 一個 topic,一個 partition,一個 consumer,內部單線程消費,單線程吞吐量太低,一般不會用這個。
- 寫 N 個內存 queue,具有相同 key 的數據都到同一個內存 queue;然后對於 N 個線程,每個線程分別消費一個內存 queue 即可,這樣就能保證順序性。