回覆列表
  • 1 # 會點程式碼的大叔

    其實在單體服務時代,也會有介面冪等性的問題,只是在分散式、高併發的場景下,介面冪等性的問題會更加明顯一些。那麼什麼是冪等性?當用戶對同一操作請求了一次或者多次,最終的結果是一致的,並不會因為多次請求產生副作用;比如同一個訂單支付了兩次,最後應該只扣客戶一次錢。

    全域性唯一ID

    每一次的請求,都有一個全域性唯一的請求ID,這個請求ID只要執行過一次就失效了:

    獲得請求ID。

    呼叫介面,同時傳遞請求ID。

    交易前判斷請求ID是否存在,如果存在直接返回結果;如果不存在,則執行交易後返回結果,同時記錄請求ID。

    許多微服務的架構,生產全域性唯一ID都被作為一個基礎的微服務,當然這個微服務的可靠性要求極高,因為這個微服務出現問題,可能會導致很多服務不能工作;所以通常分散式的架構中,會引入全域性唯一ID演算法。

    資料版本號

    這種方法適合在更新的場景中,資料中增加版本號的概念,那麼在做資料修改,把當前資料的版本號帶上,修改的時候要按照版本號判斷資料是否發生過更改。如果沒有發生過更改,則執行業務操作,並更新版本號。下面的程式碼,意會一下:

    updateDate(Object obj , int version);

    update set obj , version+1 where ...version = 入參version;

    狀態機

    有些業務流程,每一步都是有狀態的,比如網上購物可能會有:訂單建立、付款、發貨,那麼付款之前保單狀態為“待付款”,付款之後可以將保單的狀態修改為“待發貨”;那麼如果發起重複扣款的話,第二次扣款的時候保單狀態已經變化了,就會扣款失敗。

    去重表

    如果業務中有唯一性的標識時,可以使用去重表,把這個唯一性的表示儲存到去重表中,如果重複插入,那麼會被校驗住。

    比如上面的場景,一個訂單隻會付款一次,那麼在付款的時候,把訂單號作為唯一性的標識,儲存到去重表中,可以保證付款操作只會發生一次。

  • 中秋節和大豐收的關聯?
  • 值錢的老硬幣在哪裡兌換?