分布式服務接口的冪等性如何設計


  

 

  假如你有個服務提供一個接口,結果這個服務部署在了5台機器上,接着有個接口就是付款接口。

  然后用戶在前端上操作的時候,不知道為啥,總之就是一個訂單不小心發起了兩次支付請求,然后這倆請求分散在了這個服務部署的不同的機器上,結果造成一個訂單扣款扣兩次。

 

  所謂冪等性,就是說一個接口,多次發起同一個請求,你這個接口得保證結果是准確的,比如不能多扣款,不能多插入一條數據,不能將統計值多加了1。。

 

 

保證冪等性主要是三點:

  對於每個請求必須有一個唯一的標識,比如:訂單支付請求,肯定得包含訂單id,一個訂單id最多支付一次。

  每次處理完請求之后,必須有一個記錄標識這個請求處理過了,比如說常見的方案是在mysql中記錄個狀態啥的,比如支付之前記錄一條這個訂單的支付流水,而且支付流水采

  每次接收請求需要進行判斷之前是否處理過的邏輯處理,比如說,如果有一個訂單已經支付了,就已經有了一條支付流水,那么如果重復發送這個請求,則此時先插入支付流水,orderId已經存在了,唯一鍵約束生效,報錯插入不進去的。然后你就不用再扣款了。

 

  還有一種方法,比如說redis用orderId作為唯一鍵。只有成功插入這個支付流水,才可以執行實際的支付扣款。

 

 轉自:中華石杉Java工程師面試突擊

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM