status: apply created: 2026-04-06 complexity: 🔴复杂
1. 背景与目标
背景
当前系统缺乏统一的分布式幂等防重机制,存在以下问题:
- 接口重复提交、网络重试、消息重复消费等场景容易导致数据重复插入、业务逻辑重复执行等问题
- 各业务模块自行实现幂等逻辑,代码重复、实现不规范,存在漏判、误判风险
- 缺乏统一的监控、统计、降级能力,出现幂等问题排查困难
参考美团GTIS(Global Token Idempotent Service)方案,实现通用分布式幂等防重组件:
✅ 可观测:提供幂等请求统计、命中日志、告警能力
每个结论必须有代码出处(文件路径 + 类名/方法名)
2.1 相关入口与链路
待调研:
后端统一请求拦截器实现位置
Spring Boot 自动配置扩展点
Redis 操作现有封装
待调研:
是否存在零散的幂等实现
现有框架的拦截器/切面扩展能力
待补充
[ ] 核心功能1:@Idempotent注解定义与AOP切面实现
[ ] 核心功能2:幂等Token生成与校验服务(支持Header/参数/Body等多种Token传递方式)
[ ] 核心功能3:多种幂等键生成策略(SpEL表达式、自定义策略接口)
[ ] 核心功能4:Redis幂等存储实现(支持原子操作、过期时间、自动清理)
[ ] 扩展功能5:支持多种幂等模式(防重提交、防重入、执行结果缓存)
[ ] 扩展功能6:降级配置、告警统计、日志记录
待补充
| 操作 | 表名 | 字段/索引 | 说明 |
|---|---|---|---|
| 新增 | 无(Redis存储) | - | 幂等数据存储在Redis中,无需修改业务库 |
| 操作 | 接口 | 方法 | 变更内容 |
|---|---|---|---|
| 新增 | - | - | 新增注解和切面,不影响现有接口 |
后端基础组件层:新增forge-starter-idempotent启动器
业务模块:可按需引入依赖,使用@Idempotent注解
⚠️ 涉及资金/状态流转/权限变更必须标注
⚠️ 风险1:Redis故障时的降级策略,需要保证不影响主业务流程
⚠️ 风险2:幂等键冲突问题,需要保证生成的幂等键全局唯一
⚠️ 风险3:性能影响,需要保证幂等校验的耗时在10ms以内
测试范围:单元测试覆盖核心逻辑、集成测试覆盖Web接口场景、性能测试验证高并发下的表现
覆盖率目标:核心代码覆盖率100%
独立 Test Spec:是
[x] 问题1:是否需要支持除Redis之外的存储介质?→ 仅支持Redis
[x] 问题2:幂等默认过期时间设置为多长比较合适?→ 10分钟(可自定义)
[x] 问题3:是否需要支持接口级别的幂等配置全局开关?→ 需要
存储方案:仅使用Redis作为幂等存储介质,利用Redis原子操作保证高性能和一致性
默认配置:幂等记录默认过期时间10分钟,可通过@Idempotent注解的expire参数自定义
开关控制:支持全局配置开关(idempotent.enabled=true/false),注解优先级高于全局配置
幂等键生成:默认使用"用户ID+接口路径+参数哈希"作为幂等键,支持SpEL表达式自定义
异常处理:默认幂等校验失败抛出业务异常,可配置为返回上一次执行结果
高可用保障:Redis异常时自动降级,不影响主业务流程执行,同时输出告警日志
| Task | 状态 | 实际改动文件 | 备注 |
|---|---|---|---|
| Task1: 创建幂等组件模块结构与基础依赖 | ✅ 完成 | forge-starter-idempotent/pom.xml, forge-starter-parent/pom.xml, AutoConfiguration.imports | - |
| Task2: 定义@Idempotent注解与配置类 | ✅ 完成 | Idempotent.java, IdempotentProperties.java, IdempotentConstant.java | - |
| Task3: 实现幂等键生成器 | ✅ 完成 | SpelUtil.java, IdempotentKeyGenerator.java, DefaultIdempotentKeyGenerator.java | - |
| Task4: 实现Redis幂等存储服务 | ✅ 完成 | IdempotentException.java, IdempotentStorageService.java, RedisIdempotentStorageService.java | - |
| Task5: 实现AOP切面与Web拦截器 | ✅ 完成 | IdempotentAutoConfiguration.java, IdempotentAspect.java | - |
| Task6: 实现全局开关与异常处理 | ✅ 完成 | IdempotentException.java(修改继承BusinessException) | - |
| Fix: 修复代码审查发现的问题 | ✅ 完成 | 移除未使用的RedissonClient依赖、改进参数名获取、添加SpEL异常处理、添加切面全局开关检查 | - |
确认时间:
确认人: