如何處理消息隊列消費過程當中的重複消息&如何實現冪等性

什麼是冪等

冪等原本是數學上的概念,它的定義是這樣的: 若是一個函數 f(x) 知足:f(f(x)) = f(x),則函數 f(x) 知足冪等性。數據庫

在計算機領域用來描述一個操做、方法或者服務。一個冪等操做的特色是,其任意屢次執行所產生的影響均與一次執行的影響相同。服務器

場景

將林志玲帳戶的餘額加 100 元函數

方法一:利用數據庫的惟一約束實現冪等

咱們在數據庫中建一張轉帳流水錶,這個表有三個字段:轉帳單 ID、帳戶 ID 和變動金額,而後給轉帳單 ID 和帳戶 ID 這兩個字段聯合起來建立一個惟一約束,這樣對於相同的轉帳單 ID 和帳戶 ID,表裏至多隻能存在一條記錄。token

方法二:爲更新的數據設置前置條件(將方法實現冪等)

  1. 方法入參傳入林志玲的帳戶餘額,拿參數中的餘額與數據庫中的餘額作比較若是相同則執行變動操做。
  2. 最簡單的作法給數據增長一個版本號屬性,每次更改數據前,比較當前數據的版本號是否和消息中的版本一致,若是不一致就拒絕更新數據,更新數據的同時將版本號+1。(和樂觀鎖原理同樣)

方法三: 令牌機制 (記錄並檢查操做)

在發送消息時,給每條消息指定一個全局惟一的ID,消費時,先根據這個ID檢查這條消息是否有被消費過,若是沒有消費過更新數據,而後將消費狀態置爲已消費。 (先向服務器請求token,再拿着這個token請求服務器,服務器對比這個token是否存在存在正常調用,不存在忽略這個請求,調用成功刪除服務器存儲的這個token)數學


**** 碼字不易若是對你有幫助請給個關注****原理

**** 愛技術愛生活 QQ羣: 894109590****請求

相關文章
相關標籤/搜索