1. 程式人生 > 程式設計 >如何處理訊息佇列消費過程中的重複訊息&如何實現冪等性

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

什麼是冪等

冪等本來是數學上的概念,它的定義是這樣的: 如果一個函式 f(x) 滿足:f(f(x)) = f(x),則函式 f(x) 滿足冪等性。

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

場景

將林志玲賬戶的餘額加 100 元

方法一:利用資料庫的唯一約束實現冪等

我們在資料庫中建一張轉賬流水錶,這個表有三個欄位:轉賬單 ID、賬戶 ID 和變更金額,然後給轉賬單 ID 和賬戶 ID 這兩個欄位聯合起來建立一個唯一約束,這樣對於相同的轉賬單 ID 和賬戶 ID,表裡至多隻能存在一條記錄。

方法二:為更新的資料設定前置條件(將方法實現冪等)

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

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

在傳送訊息時,給每條訊息指定一個全域性唯一的ID,消費時,先根據這個ID檢查這條訊息是否有被消費過,如果沒有消費過更新資料,然後將消費狀態置為已消費。 (先向伺服器請求token,再拿著這個token請求伺服器,伺服器對比這個token是否存在存在正常呼叫,不存在忽略這個請求,呼叫成功刪除伺服器儲存的這個token)

碼字不易如果對你有幫助請給個關注

愛技術愛生活 QQ群: 894109590