冪等技術及實現方式

2021-09-25 11:04:58 字數 1215 閱讀 1997

一、什麼是冪等

冪等(idempotent)是乙個數學與計算機的概念,常見於抽象代數。在程式設計中乙個冪等操作的特點是其任意多次執行所產生的影響均與一次執行的影響相同,也不同擔心重複執行會對系統造成改變,例如,settrue()函式就是乙個冪等函式,無論執行多少次,其結果都是一樣的。

二、冪等的實現方案

冪等處理的是多次執行的問題,這並不僅僅出現在併發場景中,無論是順序執行還是併發執行,都需要做好冪等,而冪等的核心是確保唯一性。實現冪等的方式有很多,比如建立資料庫唯一索引、建立唯一資料和狀態機約束、樂觀鎖等。

在資料庫中建立唯一索引,用作冪等記錄,可以防止插入重複資料。以乙個插入業務資料的場景為例,可通過業務維度定義唯一索引作為冪等記錄,在插入資料方法中,首先查詢該冪等記錄是否存在,如果存在則直接返回第一次執行的結果,如果不存在則繼續執行,併發場景中可能存在多個執行緒同時插入冪等記錄的情況,這種情況下唯一索引可確保只有乙個執行緒可以插入冪等記錄成功,其餘執行緒拋異常。插入冪等記錄成功的執行緒可以繼續執行後續操作,拋異常的執行緒執行事務回滾操作。

建立唯一資料的方式有很多種,比如基於tair或redis實現的分布式鎖都屬於建立唯一資料來實現冪等,以基於tair實現的分布式鎖為例:

public boolean trylock(string lockkey, int expiretime, boolean reentrant) 

private string getlockvalue()

將唯一標識作為key通過trylock方法,如果返回true,說明當前是第一次呼叫,繼續執行冪等方法,如果返回false,則說明key已經被鎖定,這是可選擇重試、自旋等待、拋異常等不同策略。

update table set status=next_status where id=# and status=#
當前狀態第一次被修改後,狀態被修改為下一種狀態,同一記錄針對當前狀態的其他修改會失敗,程式跑出異常,這常見於併發場景的修改。

基於版本控制的樂觀鎖有多種實現方式,比如基於資料庫的版本控制樂觀鎖實現、基於redis的版本控制樂觀鎖實現等,以資料庫的版本控制樂觀鎖為例:

update table set version=version+1 where id=# and version=#
與基於狀態機的樂觀鎖類似,當前版本第一次本修改後,版本加1,同一記錄針對當前版本的其他修改會失敗而丟擲異常,這常見於併發場景。

參考

系統冪等以及常用實現方式

現在稍具規模的 和大型應用都不再是單機模式,而是分布式應用,基於多機的集群構建的應用,這樣服務能力就可以基本實現橫向擴容 scale out 不會像單機模式下的縱向擴容 scale up 會受到單機服務能力上限的限制。另外,隨著 微服務 概念的火爆,很多應用在構建之初就已經走在了分布式的路線上了,所...

系統冪等以及常用實現方式

現在稍具規模的 和大型應用都不再是單機模式,而是分布式應用,基於多機的集群構建的應用,這樣服務能力就可以基本實現橫向擴容 scale out 不會像單機模式下的縱向擴容 scale up 會受到單機服務能力上限的限制。另外,隨著 微服務 概念的火爆,很多應用在構建之初就已經走在了分布式的路線上了,所...

服務冪等以及常用實現方式

現在稍具規模的 和大型應用都不再是單機模式,而是分布式應用,基於多機的集群構建的應用,這樣服務能力就可以基本實現橫向擴容 scale out 不會像單機模式下的縱向擴容 scale up 會受到單機服務能力上限的限制。另外,隨著 微服務 概念的火爆,很多應用在構建之初就已經走在了分布式的路線上了,所...