其實在單體服務時代,也會有介面冪等性的問題,只是在分散式、高併發的場景下,介面冪等性的問題會更加明顯一些。那麼什麼是冪等性?當用戶對同一操作請求了一次或者多次,最終的結果是一致的,並不會因為多次請求產生副作用;比如同一個訂單支付了兩次,最後應該只扣客戶一次錢。
全域性唯一ID
每一次的請求,都有一個全域性唯一的請求ID,這個請求ID只要執行過一次就失效了:
獲得請求ID。
呼叫介面,同時傳遞請求ID。
交易前判斷請求ID是否存在,如果存在直接返回結果;如果不存在,則執行交易後返回結果,同時記錄請求ID。
許多微服務的架構,生產全域性唯一ID都被作為一個基礎的微服務,當然這個微服務的可靠性要求極高,因為這個微服務出現問題,可能會導致很多服務不能工作;所以通常分散式的架構中,會引入全域性唯一ID演算法。
資料版本號
這種方法適合在更新的場景中,資料中增加版本號的概念,那麼在做資料修改,把當前資料的版本號帶上,修改的時候要按照版本號判斷資料是否發生過更改。如果沒有發生過更改,則執行業務操作,並更新版本號。下面的程式碼,意會一下:
updateDate(Object obj , int version);
update set obj , version+1 where ...version = 入參version;
狀態機
有些業務流程,每一步都是有狀態的,比如網上購物可能會有:訂單建立、付款、發貨,那麼付款之前保單狀態為“待付款”,付款之後可以將保單的狀態修改為“待發貨”;那麼如果發起重複扣款的話,第二次扣款的時候保單狀態已經變化了,就會扣款失敗。
去重表
如果業務中有唯一性的標識時,可以使用去重表,把這個唯一性的表示儲存到去重表中,如果重複插入,那麼會被校驗住。
比如上面的場景,一個訂單隻會付款一次,那麼在付款的時候,把訂單號作為唯一性的標識,儲存到去重表中,可以保證付款操作只會發生一次。
其實在單體服務時代,也會有介面冪等性的問題,只是在分散式、高併發的場景下,介面冪等性的問題會更加明顯一些。那麼什麼是冪等性?當用戶對同一操作請求了一次或者多次,最終的結果是一致的,並不會因為多次請求產生副作用;比如同一個訂單支付了兩次,最後應該只扣客戶一次錢。
全域性唯一ID
每一次的請求,都有一個全域性唯一的請求ID,這個請求ID只要執行過一次就失效了:
獲得請求ID。
呼叫介面,同時傳遞請求ID。
交易前判斷請求ID是否存在,如果存在直接返回結果;如果不存在,則執行交易後返回結果,同時記錄請求ID。
許多微服務的架構,生產全域性唯一ID都被作為一個基礎的微服務,當然這個微服務的可靠性要求極高,因為這個微服務出現問題,可能會導致很多服務不能工作;所以通常分散式的架構中,會引入全域性唯一ID演算法。
資料版本號
這種方法適合在更新的場景中,資料中增加版本號的概念,那麼在做資料修改,把當前資料的版本號帶上,修改的時候要按照版本號判斷資料是否發生過更改。如果沒有發生過更改,則執行業務操作,並更新版本號。下面的程式碼,意會一下:
updateDate(Object obj , int version);
update set obj , version+1 where ...version = 入參version;
狀態機
有些業務流程,每一步都是有狀態的,比如網上購物可能會有:訂單建立、付款、發貨,那麼付款之前保單狀態為“待付款”,付款之後可以將保單的狀態修改為“待發貨”;那麼如果發起重複扣款的話,第二次扣款的時候保單狀態已經變化了,就會扣款失敗。
去重表
如果業務中有唯一性的標識時,可以使用去重表,把這個唯一性的表示儲存到去重表中,如果重複插入,那麼會被校驗住。
比如上面的場景,一個訂單隻會付款一次,那麼在付款的時候,把訂單號作為唯一性的標識,儲存到去重表中,可以保證付款操作只會發生一次。