消費者接收重復消息冪等性解決方案: 1.利用數據庫唯一性約束去實現冪等性創建消息去重表,把全局唯一ID作為主鍵,做唯一性約束,如果插入成功就表示沒有消費過這條消息,可以進行消費了,插入失敗表示消息已經被消費了。 2.利用Redis的原子性去實現冪等性我們都知道redis是單線程的,並且性能也非常好,提供了很多原子性的命令。比如可以使用 setnx 命令。在接收到消息后將消息ID作為key執行 setnx命令,如果執行成功就表示沒有消費過這條消息,可以進行消費了,執行失敗表示消息已經被消費了。 3.利用zookeeper分布式鎖實現冪等性在接收到消息后用消息ID來獲取這個鎖的客戶端,最終只有一個可以成功獲得這把鎖。通常的做法是把 zk 上的一個 znode 看作是一把鎖,通過 create znode 的方式來實現。所有客戶端都去創建 /lock/xxxxx 節點,最終成功創建的那個客戶端就表示沒有消費過這條消息,可以進行消費了,創建不成功的節點會收到異常的提示,表示消息已經被消費了。 總結:三種冪等性實現方案從性能上比較:redis-->zookeeper-->數據庫性。 從安全性比較:zookeeper-->數據庫-->redis