跳轉到

如何確保照順序消費訊息

訊息亂序消費,一般指我們消費者應用程式不依照上游系統業務發生的順序,進行了業務訊息的顛倒處理,最終導致業務出錯。

固定分區

一般建議同一個業務屬性數據,都往一個分區上發送;而 kafka 的一個分區只能被一個消費者實例消費,不能被多個消費者實例消費。

優點 缺點
生產端實作簡單:例如 kafka 生產端,提供了按指定 key,發送到固定分區的策略 上游難保證嚴格順序生產:生產端對同一類業務資料需要依照順序放入同一個分區;這個在應用層還是比較的難保證,畢竟上游應用都是無狀態多實例,多機器部署,存在並發情況下執行的先後順序不可控
消費端實作也簡單:kafka 消費者預設就是單執行緒執行;不需要為了順序消費而進行程式碼改造 消費者處理效能會有潛在的瓶頸:消費者端單執行緒消費,只能擴展消費者應用實例來進行消費者處理能力的提升;在訊息較多的時候,會是個處理瓶頸,畢竟幹活的進程上限是 topic 的分區數。
無其它中間件依賴 使用場景有限制:業務資料只能指定到同一個 topic,針對某些業務屬性是一類數據,但傳送到不同 topic 場景下,則不適用了。例如訂單支付訊息,和訂單退款訊息是兩個 topic,但是對於下游算傭業務來說都是同一個訂單業務數據

樂觀鎖

flowchart TD
    A[開始消費] --> B[查詢已有的訂單]
    B --> C{訊息時間是否比已有訂單的更新時間還要新}
    C  -- No --> D[結束]
    C -- Yes --> E[計算佣金]
    E --> F[根據訂單ID和時間更新訂單]
    F --> G{是否更新成功}
    G -- Yes --> D
    G -- No --> A

Reference