# distributed-idempotency
**Repository Path**: xiaowugui521/distributed-idempotency
## Basic Information
- **Project Name**: distributed-idempotency
- **Description**: Distributed Idempotency Component for Java - Spring Boot Starter
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-04-19
- **Last Updated**: 2026-04-20
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 分布式幂等组件
一个轻量级的分布式幂等解决方案,支持 Redis 和本地内存两种存储后端。
## 特性
- **零侵入**:通过注解方式使用,业务代码无需改造
- **多种存储后端**:Redis(分布式)/ LocalStorage(单机)
- **自动降级**:Redis 不可用时自动降级到本地存储
- **结果缓存**:重复请求可返回缓存结果
- **多种等待策略**:FAIL_FAST(快速失败)/ WAIT(等待结果)
- **SpEL 表达式**:支持动态生成幂等键
## 快速开始
### 1. 添加依赖
```xml
com.xiaogui
distributed-idempotency
1.0.0
```
### 2. 启用组件
```java
@SpringBootApplication
@EnableConfigurationProperties(IdempotencyConfig.class)
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
```
### 3. 在需要幂等的方法上添加注解
```java
@Service
public class OrderService {
@Autowired
private IdempotencyManager idempotencyManager;
@Idempotent(
key = "'order:create:' + #orderId",
expireTime = 30,
unit = TimeUnit.SECONDS,
desc = "订单创建幂等"
)
public Order createOrder(String orderId, CreateOrderDTO dto) {
// 业务逻辑,只会被执行一次
return orderRepository.save(dto.toOrder());
}
}
```
## 配置项
```yaml
idempotency:
enabled: true # 是否启用,默认 true
storage: redis # 存储类型:redis / local
default-expire-time: 30 # 默认过期时间(秒)
default-wait-timeout: 3 # 默认等待超时(秒)
```
## 注解说明
| 属性 | 类型 | 默认值 | 说明 |
|------|------|--------|------|
| key | String | - | **必填**,幂等键,支持 SpEL 表达式 |
| expireTime | long | 30 | 过期时间 |
| unit | TimeUnit | SECONDS | 时间单位 |
| desc | String | "" | 描述(用于日志) |
| deleteAfter | boolean | false | 是否在响应后删除锁 |
| waitStrategy | WaitStrategy | FAIL_FAST | 等待策略 |
| waitTimeout | long | 3 | 等待超时(秒) |
## 使用示例
### 订单创建
```java
@Idempotent(
key = "'order:create:' + #orderId",
expireTime = 30,
unit = TimeUnit.SECONDS,
desc = "订单创建幂等"
)
public Order createOrder(String orderId, CreateOrderRequest request) {
// 业务逻辑
return orderRepository.save(convert(request));
}
```
### 支付回调
```java
@Idempotent(
key = "'payment:callback:' + #transactionId",
expireTime = 3600,
unit = TimeUnit.SECONDS,
desc = "支付回调幂等"
)
public PaymentResult handleCallback(String transactionId, PaymentDTO payment) {
// 处理支付回调
return paymentService.process(payment);
}
```
### 等待策略
```java
// FAIL_FAST:检测到重复直接抛异常
@Idempotent(key = "'order:' + #orderId", waitStrategy = FAIL_FAST)
public void submitOrder(String orderId) { }
// WAIT:等待直到获取结果或超时
@Idempotent(
key = "'order:' + #orderId",
waitStrategy = WAIT,
waitTimeout = 5
)
public Result submitOrder(String orderId) {
// 返回缓存结果
}
```
### 手动模式
```java
@Service
public class OrderService {
@Autowired
private IdempotencyManager idempotencyManager;
public void manualIdempotent(String orderId) {
String key = "order:manual:" + orderId;
// 手动检查
if (!idempotencyManager.tryAcquireSimple(key, 60, TimeUnit.SECONDS)) {
throw new IdempotentException("正在处理中,请勿重复提交");
}
try {
// 业务逻辑
doProcess(orderId);
} finally {
idempotencyManager.releaseSimple(key);
}
}
}
```
## 架构设计
```
┌─────────────────────────────────────────────────────────────┐
│ @Idempotent 注解 │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ IdempotencyInterceptor │
│ (AOP 拦截器) │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ IdempotencyManager │
│ (核心管理器) │
└─────────────────────────────────────────────────────────────┘
│
┌───────────────┼───────────────┐
▼ ▼ ▼
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ RedisStorage │ │ LocalStorage │ │ 其他存储... │
│ (分布式环境) │ │ (单机/测试) │ │ │
└─────────────────┘ └─────────────────┘ └─────────────────┘
```
## 工作原理
1. **首次请求**:SETNX 获取锁 → 执行业务逻辑 → 存储结果 → 返回
2. **重复请求**:SETNX 返回 false → 检测到重复 → 返回缓存结果或抛异常
## License
MIT License