接口冪等性設計| 8月更文挑戰

01 什麼是接口冪等性

接口冪等性就是用戶對於同一操做發起的一次請求或者屢次請求的結果是一致的,不會由於屢次點擊而產生了反作用。舉個最簡單的例子,那就是支付,用戶購買商品後支付,支付扣款成功,可是返回結果的時候網絡異常,此時錢已經扣了,用戶再次點擊按鈕,此時會進行第二次扣款,返回結果成功,用戶查詢餘額返發現多扣錢了,流水記錄也變成了兩條...,這就沒有保證接口的冪等性redis

02 基本思路

核心是判斷兩次請求是否爲同一操做。一般方法是解析請求全部參數,判斷參數是否徹底一致。若是兩次參數同樣,則是重複提交。還有是經過惟一索引來判斷,如發貨操做,一筆訂單隻能發貨一次。因此能夠經過惟一訂單號來判斷兩次是否爲重複提交。markdown

03 具體實現

  1. 定義冪等性註解,在須要冪等性的接口加上此註解
  2. 項目啓動時,掃描冪等性註解,解析具體接口URL,並將URL與冪等性接口一一綁定,生成map對象,以便後續快速根據URL判斷此接口是否須要冪等性判斷
  3. 新增冪等性攔截器。根據URL判斷此請求是否須要冪等性校驗(第2步已將數據封裝,可快速判斷)。
  4. 將請求參數按照特定規則生成key值,根據此Key值,從redis獲取具體值,若是爲null,則爲首次(正常)訪問。不然爲重複訪問,須要過濾此請求。

04 延伸:限流

場景:限制單個用戶每一個小時只能訪問某個接口100次網絡

實現:將用戶的每次訪問時間記錄在redis中,每次訪問獲取第100前的訪問時間。若是未能獲取到訪問時間,則說明該用戶未訪問100次。若是獲取到時間,則判斷該時間是否在一小時內,若是是在一小時內,則該用戶須要限流,不能再訪問了。若是不在一小時內,則從redis移除該訪問記錄。spa

相關文章
相關標籤/搜索