假如你有個服務提供一個接口,結果這個服務部署在了5台機器上,接着有個接口就是付款接口。
然后用戶在前端上操作的時候,不知道為啥,總之就是一個訂單不小心發起了兩次支付請求,然后這倆請求分散在了這個服務部署的不同的機器上,結果造成一個訂單扣款扣兩次。
所謂冪等性,就是說一個接口,多次發起同一個請求,你這個接口得保證結果是准確的,比如不能多扣款,不能多插入一條數據,不能將統計值多加了1。。
保證冪等性主要是三點:
對於每個請求必須有一個唯一的標識,比如:訂單支付請求,肯定得包含訂單id,一個訂單id最多支付一次。
每次處理完請求之后,必須有一個記錄標識這個請求處理過了,比如說常見的方案是在mysql中記錄個狀態啥的,比如支付之前記錄一條這個訂單的支付流水,而且支付流水采
每次接收請求需要進行判斷之前是否處理過的邏輯處理,比如說,如果有一個訂單已經支付了,就已經有了一條支付流水,那么如果重復發送這個請求,則此時先插入支付流水,orderId已經存在了,唯一鍵約束生效,報錯插入不進去的。然后你就不用再扣款了。
還有一種方法,比如說redis用orderId作為唯一鍵。只有成功插入這個支付流水,才可以執行實際的支付扣款。
轉自:中華石杉Java工程師面試突擊