順序就像就是 12345,任何 12354、12543、51234等都不行。
因為是 mq,所以必然涉及三個主體:發送方、消息服務器、消費方。
一、kafka 消息服務器
kafka brokers 順序接收客戶端請求,將消息順序追加到 partition 尾部,kafka 能保證單個分區里消息的順序性。
二、發送方
由第一點可知,我們只要把消息按順序發送到同一個分區就好了。但這里也存在幾個問題:
1、怎么保證要發送的消息的順序性?
對於單節點服務:使用全局唯一的 producer。
對於多節點、分布式服務,則需要全局鎖來控制涉及同一數據變更的操作(串行操作)。
2、怎么把順序的消息發送到同一個分區?
基於特定的分區策略將需要保障順序的消息路由到特定的分區,kafka 默認如果存在鍵的話,采用基於鍵的哈希模分區策略。
3、嚴格的消息順序?
配置:在接收到服務器響應之前能夠發送多少消息 max.in.flight.requests.per.connection = 1。
或者
max.in.flight.requests.per.connection <= 5
+
冪等:enable.idempotence = true
三、消費方
保證需要順序消費的消息由同一個線程消費。
開辟一定數量的工作線程,分別固定消費不同類別的順序消息。