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