爲何須要冪等性?網絡
若是從開發角度考慮:架構
若是要作冪等,首先對請求進行分類,通常分爲讀請求和寫請求,讀請求通常不須要作冪等,讀數據自己不會改變數據,所以無需作冪等,而寫請求可能對數據形成改變,全部部分寫請求須要進行冪等。併發
從架構層次上,看看那些層會對數據發生改變。分佈式
網關,業務邏輯通常不會修改數據ui
數據訪問層可能修改數據,咱們只須要對數據訪問層進行冪等性設計設計
對於數據訪問層CRUD:3d
新增數據的時候,經過主鍵或者某個惟一標識如token,限制某條記錄只能插入一次。cdn
更新數據的時候,部分冪等。部分不冪等blog
刪除數據的時候,部分冪等,部分非冪等,在實際刪除的時候不要經過相對值來刪除,通常在刪除以前首先進行一次查詢,而後進行絕對刪除token
真正須要處理的是update操做。如何處理呢?
業務層次的冪等如何解決呢?
好比下了一個訂單,可是冗餘部署了多個進程,這個時候存在併發消費的可能性。對此咱們能夠嘗試將並行操做轉換爲串行操做,採用分佈式鎖。
共享資源經過鎖來保證。
通常在分佈式系統中,全部請求都會攜帶一個惟一的請求流水號,requestNo,在進行操做以前判斷這個requestNo是否已經入庫了,若是在庫中已經存在,表明已經處理過,若是不存在則繼續處理。
通常一次操做對應的是一個請求流水號,若是請求流水號不一樣,表明的是兩次操做。