分布式接口冪等性的演進和最佳實踐,含springBoot 實現(Java版本)

一、背景:為什么需要冪等性

在微服務、分布式架構下,網絡不可靠、請求重試機制(如前端超時重發、客戶端重發、網關重試、消息消費失敗重試等)會帶來重復請求,如果接口沒有冪等性,可能導致:

  • 重復扣費
  • 重復訂單
  • 重復數據寫入
  • 資源狀態異常

因此接口的冪等性是保障系統一致性、穩定性的關鍵。


二、冪等性的演進歷程

階段實現方式適用場景特點
1. 前端防重復提交禁用按鈕、Token機制簡單場景(如表單)限制小,易繞過
2. 數據庫唯一約束唯一索引字段控制插入插入類接口利用數據庫能力
3. 冪等標識(唯一業務ID)唯一業務號控制冪等訂單類接口明確控制粒度
4. 分布式鎖請求上鎖任意接口控制請求串行,犧牲吞吐
5. 狀態機機制狀態+版本控制狀態轉換操作精細控制副作用
6. Redis 冪等性控制冪等Key+過期時間高并發下快速、安全,結合令牌機制

三、最佳實踐總結

🧠 原則

  • 冪等性以“結果相同”為基準,副作用不可重復。
  • 控制粒度應適當:寫操作必須冪等,讀操作天然冪等。
  • 冪等 Token 最好由客戶端生成或服務端下發后強制綁定。

? 最佳實踐建議

  • 業務唯一標識驅動冪等性,如訂單號、支付流水號。
  • 冪等性應放在業務代碼邏輯前端處理,即“第一次判斷是否重復提交”。
  • 采用 Redis + 原子操作(如SETNX)+ Token + TTL 實現防重。
  • 接口冪等性建議作為注解能力進行抽象封裝,統一使用。

四、Spring Boot 實現示例(完善版)

下面我們以 Token機制 + Redis原子寫入實現接口冪等性,構建完整示例。

1?? 添加依賴

<!-- Redis starter -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

2?? Redis配置類(Lettuce連接池)

@Configuration
public class RedisConfig {@Beanpublic RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) {RedisTemplate<String, String> template = new RedisTemplate<>();template.setConnectionFactory(factory);template.setKeySerializer(new StringRedisSerializer());template.setValueSerializer(new StringRedisSerializer());return template;}
}

3?? 冪等Token生成接口(服務端)

@RestController
@RequestMapping("/token")
public class TokenController {@Autowiredprivate RedisTemplate<String, String> redisTemplate;@GetMapping("/generate")public String generateToken() {String token = UUID.randomUUID().toString();redisTemplate.opsForValue().set("idem-token:" + token, "valid", 5, TimeUnit.MINUTES);return token;}
}

4?? 冪等校驗注解

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Idempotent {String key() default "";  // 可自定義Key策略
}

5?? 冪等校驗切面

@Aspect
@Component
public class IdempotentAspect {@Autowiredprivate RedisTemplate<String, String> redisTemplate;@Around("@annotation(idempotent)")public Object checkIdempotency(ProceedingJoinPoint joinPoint, Idempotent idempotent) throws Throwable {HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();String token = request.getHeader("Idempotency-Token");if (StringUtils.isEmpty(token)) {throw new RuntimeException("冪等Token不能為空");}String redisKey = "idem-token:" + token;Boolean result = redisTemplate.delete(redisKey);  // 核心邏輯:刪除即消費if (Boolean.FALSE.equals(result)) {throw new RuntimeException("重復請求,請勿重復提交");}return joinPoint.proceed();}
}

6?? 接口使用示例

@RestController
@RequestMapping("/order")
public class OrderController {@PostMapping("/create")@Idempotentpublic String createOrder(@RequestBody OrderDTO orderDTO) {// 模擬業務邏輯return "訂單創建成功,訂單號:" + UUID.randomUUID().toString();}
}

7?? Postman 調用流程:

  1. 調用 GET /token/generate 獲取 token

  2. 調用 POST /order/create,在請求頭加上:

    Idempotency-Token: 你剛剛拿到的token
    

多次調用同一個 token,只會成功一次,后續將拋出“重復請求”異常。


五、可擴展建議

功能實現方式
支持注解中的自定義 key 邏輯SpEL 表達式,讀取參數字段
冪等記錄持久化Redis + 數據庫雙寫
異常重試隊列支持Kafka / RocketMQ 消息冪等處理
Redisson替換RedisTemplate使用 RLock.tryLock() 可實現鎖粒度的冪等控制

六、架構圖(邏輯)

客戶端|
[請求附帶Token]|
Spring Boot 接口(注解攔截)|
切面邏輯校驗 Token|
Redis SETNX 刪除 key -> 是第一次? -> 繼續業務|
業務邏輯執行(訂單創建、支付、提交...)

后續實例回陸續添加

參數冪等、結果緩存、冪等日志記錄

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/90486.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/90486.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/90486.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

OGRE 3D----6. 背景圖片渲染實現詳解

1. 背景圖片渲染原理 1.1 渲染隊列機制 Ogre3D 使用渲染隊列(Render Queue)來控制對象的渲染順序。背景圖片需要在所有其他對象之前渲染,因此我們將其設置為 RENDER_QUEUE_BACKGROUND。 1.2 視圖變換控制 為了讓背景圖片始終保持在場景的最遠處,我們需要: 使用單位投影…

K線連續漲跌統計與分析工具

K線連續漲跌統計與分析工具 1. 概述 本工具是一個用于分析金融時間序列數據(特別是K線數據)的Python腳本,主要功能是統計連續n根同方向K線后,第n+1根K線的漲跌情況。該工具不僅提供統計分析功能,還支持圖形化標記以驗證結果,幫助交易者和量化分析師識別市場中的特定模式…

jQuery EasyUI 簡介

jQuery EasyUI 簡介 引言 隨著互聯網技術的飛速發展,前端開發變得越來越重要。jQuery EasyUI 作為一款流行的前端UI框架,極大地簡化了前端開發的工作流程,提高了開發效率。本文將詳細介紹 jQuery EasyUI 的起源、特點、使用方法以及在實際項目中的應用。 一、jQuery Easy…

《測試開發:從技術角度提升測試效率與質量》

測試開發的核心工作內容與職責解析 一、測試開發的定位與核心價值 測試開發&#xff08;Test Development&#xff0c;簡稱 TestDev 或 SDET&#xff09;是融合軟件開發能力與測試工程思維的復合型崗位&#xff0c;不同于傳統測試工程師&#xff0c;其核心目標是通過技術手段提…

20250710解決KickPi的K7開發板刷機之后出現DDR異常:ch:1 dq0 fail,write:0x1,read:0x20300

20250710解決KickPi的K7開發板刷機之后出現DDR異常&#xff1a;ch:1 dq0 fail,write:0x1,read:0x20300 2025/7/10 20:36[BEGIN] 2025/7/10 19:29:03 /DDR 2f85f4b2d4 cym 25/03/04-14:38.55,fwver: v1.09 In ch0 ttot10 ch0 ttot10 ch1 ttot10 ch0 ttot18 LPDDR4, 2112MHz chan…

Ansible:強大的自動部署工具

文章目錄零、Ansible介紹一、安裝 ansible二、配置SSH密鑰1.檢查密鑰是否存在2.兩邊的機器要互相有對方的密鑰三、自動部署1.傳輸文件(1)inventory.ini(2)sync_blt.yml(3)執行命令2.安裝軟件(1)inventory.ini(2)install_efvs.yml(3)執行命令零、Ansible介紹 Ansible 是一個開源…

Nacos的基本功能以及使用Feign進行微服務間的通信

Nacos是Dynamic Naming and Configuration Service的縮寫。What’s Nacos? 下面結合SpringBoot項目&#xff0c;為你介紹Nacos的基本功能以及如何使用Feign進行微服務間的通信。 一、Nacos的基本功能 Nacos是阿里巴巴開源的一個更易于構建云原生應用的動態服務發現、配置管…

C1編譯器和C2編譯器Test01

在HotSpot VM中內嵌有兩個JIT編譯器&#xff0c;分別為Client Compiler和Server Compiler&#xff0c;通常簡稱為C1編譯器和C2編譯器。開發人員可以通過如下命令顯式指定JVM在運行時到底使用哪一種即時編譯器。(1)-client&#xff1a;指定JVM運行在Client模式下&#xff0c;并使…

MongoDB與Spring Boot完整使用指南

目錄 1. MongoDB基礎概念 什么是MongoDB? 核心概念對比 文檔結構示例 2. MongoDB的特點與優勢 主要特點 適用場景 3. MongoDB基本操作 基本CRUD操作 插入文檔 查詢文檔 更新文檔 刪除文檔 4. Spring Boot集成MongoDB 步驟1:添加依賴 步驟2:配置數據庫連接 …

swift開發,關于應用、頁面、視圖的生命周期

目錄一、應用生命周期&#xff08;App Lifecycle&#xff09;UIKit (AppDelegate)SwiftUI (使用 ScenePhase)二、頁面生命周期&#xff08;ViewController Lifecycle&#xff09;三、視圖生命周期&#xff08;UIView Lifecycle&#xff09;四、SwiftUI 視圖生命周期五、關鍵對比…

借助HarmonyOS SDK,《NBA巔峰對決》實現“分鐘級啟動”到“秒級進場”

《NBA巔峰對決》是由望塵科技推出的國內首個真實還原5V5王朝模式的操作籃球手游&#xff0c;提供流暢操作手感和真實籃球賽場體驗。豐富的玩法在為玩家帶來高質游戲體驗的同時&#xff0c;間接帶來了啟動流程冗長的問題&#xff0c;資源更新階段的等待感尤為突出。 “我們發現&…

HT-LINK ICE:海速芯32Gbps信號調理芯片,40dB補償+國產自主,打破高速互聯瓶頸!

HT-LINK ICE&#xff08;TENX海速芯&#xff09;產品解析與推廣文案一、產品定位HT-LINK ICE是TENX海速芯推出的高速信號調理芯片&#xff0c;專為PCIe 5.0/6.0、USB4、Thunderbolt等超高速接口設計&#xff0c;提供信號完整性增強和時鐘恢復功能&#xff0c;適用于數據中心、A…

深入剖析 ADL:C++ 中的依賴查找機制及其編譯錯誤案例分析

一、ADL 的定義與背景&#xff08;一&#xff09;ADL 的定義ADL&#xff08;Argument-Dependent Lookup&#xff0c;依賴查找&#xff09;是 C 中一種特殊的名稱查找機制&#xff0c;用于在調用函數時&#xff0c;根據函數參數的類型來確定查找的命名空間范圍。ADL 的核心思想是…

【科研繪圖系列】R語言繪制相關系數圖

文章目錄 介紹加載R包數據下載導入數據數據預處理畫圖系統信息參考介紹 【科研繪圖系列】R語言繪制相關系數圖 加載R包 library(vegan) library(dplyr)# install.packages("./RVisulizationData/003.mantel test/ggcor_0.9.8.1.tar.gz", repos = NULL, type = &quo…

pharokka phold--快速噬菌體注釋工具

pharokka是一款專用于噬菌體基因組及宏基因組的快速標準化注釋工具。PS.仍在積極更新中&#xff0c;最近一次更新是在今年6.20。 若需對細菌基因組進行快速標準化注釋&#xff0c;建議使用Bakta。啟發pharokka開發及命名的Prokka也是優秀選擇&#xff0c;但Bakta實為Prokka的卓…

深入淺出 Python Asynchronous I/O:從 asyncio 入門到實戰

在現代軟件開發中&#xff0c;性能是一個永恒的話題。特別是在處理網絡請求、文件讀寫等 I/O 密集型任務時&#xff0c;傳統的同步編程模型可能會因為等待而浪費大量時間。為了解決這個問題&#xff0c;異步編程應運而生。Python 通過內置的 asyncio 庫&#xff0c;為開發者提供…

OpenCV顏色矩哈希算法------cv::img_hash::ColorMomentHash

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 該類實現了顏色矩哈希算法&#xff08;Color Moment Hash&#xff09;&#xff0c;用于圖像相似性比較。它基于圖像在HSV顏色空間中的顏色矩統計特…

上海交大醫學院張維拓老師赴同濟醫院做R語言訓練營培訓

當前&#xff0c;醫學與人工智能的深度融合正迎來歷史性發展機遇。華中科技大學同濟醫學院附屬同濟醫院&#xff08;以下簡稱“同濟醫院”&#xff09;作為醫療人工智能應用的先行探索者&#xff0c;已在電子病歷輔助書寫、科研數據分析、醫療合同自動化審核等關鍵場景完成試點…

使用阿里云/騰訊云安裝完成mysql使用不了

顯示錯誤1130 - Host 106.228.110.117 is not allowed to connect to this MySQL server解決方案進入服務器的mysql命令行mysql -u root -p查看數據庫SHOW DATABASES;選擇mysql數據庫USE mysql;查看里面的表SHOW TABLES;查詢user表格的權限限制SELECT Host, User FROM user;將權…

第35周—————糖尿病預測模型優化探索

目錄 目錄 前言 1.檢查GPU 2.查看數據 ?編輯 3.劃分數據集 4.創建模型與編譯訓練 5.編譯及訓練模型 6.結果可視化 7.總結 前言 &#x1f368; 本文為&#x1f517;365天深度學習訓練營中的學習記錄博客 &#x1f356; 原作者&#xff1a;K同學啊 1.檢查GPU import torch.n…