天天看點

【dubbo】分布式系統中接口的幂等性該如何設計

一、問題

       分布式系統中,分布式服務接口的幂等性如何設計(比如,不能重複扣款)。

       從這個問題開始,面試官就已經進入了實際的生産問題的面試啦。分布式系統中的某個接口,要保證幂等性,如何保證?

       假如你有個服務提供1個接口,結果這個服務部署在5台機器上。接着有個接口,就是付款接口,然後使用者在前端操作的時候,不知道為啥,總之就是1個訂單不小心發起了兩次支付請求。然後這兩個請求分散在了不同伺服器上。結果一個訂單,扣款兩次。

       或者是訂單系統調用支付系統進行支付,因為網絡逾時了,然後訂單系統走了重試機制,咔嚓給你重試一把, 好,支付系統收到一個支付請求兩次。而且因為負載均衡算法落在了不同的機器上。

一、單機JVM

       如果不保證幂等性,一個訂單被支付兩次,使用者被扣款兩次。 

【dubbo】分布式系統中接口的幂等性該如何設計

二、分布式系統

       這不是技術問題,沒有通用的一個方法,需要結合業務來看,如何保證幂等性。所謂幂等性就是說一個接口多次發起同一個請求,你這個接口得保證結果是準确的。比如說不能多扣款。不能多插入一條資料。

       如何保證幂等性主要是三點:

       1、對于每一個請求必須有一個唯一的标志。舉個例子:訂單支付請求,肯定得包含訂單id,一個訂單id最多支付一次。

       2、每次處理完請求之後,必須有1個記錄标志這個請求處理過了。比如說常見的方式是mysql中記錄個狀态。比如支付之前記錄一下,這個訂單的支付流水,而且支付流水采用orderId作為唯一鍵。隻有成功插入這個支付流水,才可以執行實際的支付扣款。

【dubbo】分布式系統中接口的幂等性該如何設計

       3、

【dubbo】分布式系統中接口的幂等性該如何設計

       4、

【dubbo】分布式系統中接口的幂等性該如何設計