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