這是實戰經常遇到的乙個問題,舉個例子:我們系統的開票介面受理對方系統的報文(結算單號settleno+開票單號ticketno)由於網路抖動或者前端提交多次導致同一筆重複請求,如果不設定冪等,我們系統就會受理多筆相同的請求,最終可能導致多次重複開票的問題。所以我們要保證介面冪等,使得重複請求只會成功一次。
同步鎖synchronized只能解決單機jvm的介面冪等,由於分布式系統有很多臺機器,該方法無法應對。
mysql唯一索引,將結算單號settleno+開票單號ticketno設定為唯一索引,這樣第一筆入庫,第二筆重複的就會觸發duplicateexception然後回滾。
redis快取,利用redis快取,使用set key value 命令, settleno+開票單號ticketno作為key,state作為value,第一次請求過來,state從0變為1表明已經受理,第二次再過來發現state是1就不做後續處理。
*************** 當你發現自己的才華撐不起野心時,就請安靜下來學習吧!***************
分布式系統介面冪等實現
1.背景 最近的系統中使用了springcloud微服務框架,這種分布式框架的確提供了非常多便利的地方,不過隨之也出現了很多的問題,特別是在實際開發中,介面的冪等性。而所謂的冪等,通俗點說就是乙個操作不管請求多少次返回的結果都是一樣的,比如支付 扣除庫存 扣除積分等等,如果因為網路問題而出現多扣 多...
分布式環境下保證冪等性
分布式環境中 非分布式也一樣 在對某個進行資料新增的時候比如 點讚,使用者點讚的時候將點贊資訊存入到點讚表中,然後就是校驗點讚查詢是否存在一條記錄,考慮到一些外界原因 dubbo 重新發起請求,當然正式環境下是關閉重新請求的,插入成功後沒有給客戶端返回成功資訊等等。導致重複提交點讚資訊,這個時候資料...
分布式系統的介面冪等性設計
在微服務架構下,我們在完成乙個訂單流程時經常遇到下面的場景 乙個訂單建立介面,第一次呼叫超時了,然後呼叫方重試了一次 在訂單建立時,我們需要去扣減庫存,這時介面發生了超時,呼叫方重試了一次 當這筆訂單開始支付,在支付請求發出之後,在服務端發生了扣錢操作,介面響應超時了,呼叫方重試了一次 乙個訂單狀態...