Spring Boot接口冪等插件用法示例解析
冪等概述
冪等性原本是數學上的概念,即使公式:f(x)=f(f(x)) 能夠成立的數學性質。用在編程領域,則意為對同一個系統(tǒng),使用同樣的條件,一次請求和重復的多次請求對系統(tǒng)資源的影響是一致的。
冪等性是分布式系統(tǒng)設計中十分重要的概念,具有這一性質的接口在設計時總是秉持這樣的一種理念:調用接口發(fā)生異常并且重復嘗試時,總是會造成系統(tǒng)所無法承受的損失,所以必須阻止這種現象的發(fā)生。
實現冪等的方式很多,目前基于請求令牌機制適用范圍較廣。其核心思想是為每一次操作生成一個唯一性的憑證,也就是 token。一個 token 在操作的每一個階段只有一次執(zhí)行權,一旦執(zhí)行成功則保存執(zhí)行結果。對重復的請求,返回同一個結果(報錯)等。參考《冪等性淺談》
冪等處理實現加入依賴
配置 Redis
鏈接默認情況下,可以不配置。理論是支持 redisson-spring-boot-starter 全部配置
spring: redis: host: 127.0.0.1 port: 6379
接口
@Idempotent(key = "#key", expireTime = 10, info = "請勿重復查詢")
@GetMapping("/test")
public String test(String key) {
return "success";
}
測試10 個獨立線程請求

執(zhí)行查看結果,10 個請求只會有一個成功

查看后臺異常報錯,9 個異常報錯滿足預期

idempotent 注解說明
- key: 冪等操作的唯一標識,使用 spring el 表達式 用#來引用方法參數 。 可為空則取當前 url + args 做請求的唯一標識
- expireTime: 有效期 默認:1 有效期要大于程序執(zhí)行時間,否則請求還是可能會進來
- timeUnit: 時間單位 默認:s (秒)
- info: 冪等失敗提示信息,可自定義
- delKey: 是否在業(yè)務完成后刪除 key true:刪除 false:不刪除
冪等處理設計原理
1.請求開始前,根據 key 查詢 查到結果:報錯 未查到結果:存入 key-value-expireTime key=ip+url+args
2.請求結束后,直接刪除 key 不管 key 是否存在,直接刪除 是否刪除,可配置
3.expireTime 過期時間,防止一個請求卡死,會一直阻塞,超過過期時間,自動刪除 過期時間要大于業(yè)務執(zhí)行時間,需要大概評估下;
4.此方案直接切的是接口請求層面。
5.過期時間需要大于業(yè)務執(zhí)行時間,否則業(yè)務請求 1 進來還在執(zhí)行中,前端未做遮罩,或者用戶跳轉頁面后再回來做重復請求 2,在業(yè)務層面上看,結果依舊是不符合預期的。
6.建議 delKey = false。即使業(yè)務執(zhí)行完,也不刪除 key,強制鎖 expireTime 的時間。預防 5 的情況發(fā)生。
7.實現思路:同一個請求 ip 和接口,相同參數的請求,在 expireTime 內多次請求,只允許成功一次。
8.頁面做遮罩,數據庫層面的唯一索引,先查詢再添加,等處理方式應該都處理下。
9.此注解只用于冪等,不用于鎖,100 個并發(fā)這種壓測,會出現問題,在這種場景下也沒有意義,實際中用戶也不會出現 1s 或者 3s 內手動發(fā)送了 50 個或者 100 個重復請求,或者弱網下有 100 個重復請求;
總結
pig-mesh/idempotent-spring-boot-starter
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
Java并發(fā)編程示例(六):等待線程執(zhí)行終止
這篇文章主要介紹了Java并發(fā)編程示例(六):等待線程執(zhí)行終止,在本節(jié),示例程序演示等待初始化方法完成后,再去執(zhí)行其他任務,需要的朋友可以參考下2014-12-12
Android開發(fā)Activity管理工具類的操作方法
這篇文章主要介紹了Android開發(fā)Activity管理工具類,下面是一個完整的Activity管理工具類實現,可以幫助你管理應用中的所有Activity,方便一鍵退出應用、獲取當前Activity等操作,需要的朋友可以參考下2021-02-02
SpringBoot整合Netty+Websocket實現消息推送的示例代碼
WebSocket使得客戶端和服務器之間的數據交換變得更加簡單,允許服務端主動向客戶端推送數據,本文主要介紹了SpringBoot整合Netty+Websocket實現消息推送的示例代碼,具有一定的參考價值,感興趣的可以了解一下2024-01-01
Apache?SkyWalking?監(jiān)控?MySQL?Server?實戰(zhàn)解析
這篇文章主要介紹了Apache?SkyWalking?監(jiān)控?MySQL?Server?實戰(zhàn)解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-09-09
SpringBoot實戰(zhàn)之高效使用枚舉參數(原理篇)案例詳解
這篇文章主要介紹了SpringBoot實戰(zhàn)之高效使用枚舉參數(原理篇)案例詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下2021-09-09

