MQ 消費端如何保證冪等性?

MQ 消息重複,如何保證消費端的冪等性

MVCC(多版本併發控制)方式

這是樂觀鎖的一種實現,每一次要對庫存的數量 + 1,

這種方式解決消息重複沒有問題,但不太好,因爲消息在生產的時候,生產者要判斷 id 是不是重複的,如果是重複的,下一次 version+1,相當於瀏覽器點擊了 2 次。

這種方式雖然可以解決消息冪等性問題,但要求生產者也要改動,一般情況下不推薦。

去重表

併發不是很高用 mysql 實現,併發高用 redis 實現。

在表上要構建一個唯一性的索引,電商平臺有一個訂單 id,適合做唯一性的索引,比如在進行庫存扣減的時候,每次針對 goods 表的操作都會涉及到一筆訂單,下了單或退了單,那操作的訂單 id 是唯一的。

如果重複 insert 就會報已存在該訂單 id,捕獲異常,返回 1,就表示 MQ 中已消費完這條消息了。

用 redis setnx 命令也可以實現,假設 mq 中有 2 條一摸一樣的數據,第一條消息保存到 redis,進行具體的業務處理,第二條消息,先查詢 redis 中是否存在,存在返回 0,此時也不需要捕獲異常了。

如果是分佈式系統,需要使用分佈式鎖,

這是採用 redis 分佈式鎖實現的去重。

這是 mysql 實現的去重。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/j0tIP6qK-IuiyU9B9oXbUg