順序會錯亂的倆場景:
RabbitMQ:一個 queue,多個 consumer。比如,生產者向 RabbitMQ 里發送了三條數據,順序依次是 data1/data2/data3,壓入的是 RabbitMQ 的一個內存隊列。有三個消費者分別從 MQ 中消費這三條數據中的一條,結果消費者2先執行完操作,把 data2 存入數據庫,然后是 data1/data3。這不明顯亂了。
Kafka:比如說建了一個 topic,有三個 partition。生產者在寫的時候,其實可以指定一個 key,比如說指定了某個訂單 id 作為 key,那么這個訂單相關的數據,一定會被分發到同一個 partition 中去,而且這個 partition 中的數據一定是有順序的。
消費者從 partition 中取出來數據的時候,也一定是有順序的。到這里,順序還是 ok 的,沒有錯亂。接着,我們在消費者里可能會搞多個線程來並發處理消息。因為如果消費者是單線程消費處理,而處理比較耗時的話,比如處理一條消息耗時幾十 ms,那么 1 秒鍾只能處理幾十條消息,這吞吐量太低了。而多個線程並發跑的話,順序可能就亂掉了。
rabbitmq保證數據的順序性
如果存在多個消費者,那么就讓每個消費者對應一個queue,然后把要發送的數據全都放到一個queue,這樣就能保證所有的數據只到達一個消費者從而保證每個數據到達數據庫都是順序的
rabbitmq:拆分多個queue,每個queue一個consumer,就是多一些queue而已,確實是麻煩點;或者就一個queue但是對應一個consumer,然后這個consumer內部用內存隊列做排隊,然后分發給底層不同的worker來處理

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