← ClaudeAtlas

idempotency-golisted

Go 幂等性处理专家 - 幂等键设计、状态追踪、去重策略、分布式幂等、清理策略。适用:支付扣款操作、订单创建、消息消费去重(Kafka/Pulsar at-least-once)、Webhook 回调去重、Saga 补偿操作。不适用:天然幂等操作(GET/PUT/DELETE)、高频读取接口(查询类无需幂等检查)、无状态纯函数计算。触发词:idempotent, idempotency, dedup, deduplication, retry, Idempotency-Key, 幂等, 去重, 重试, 防重复
omeyang/Thoth · ★ 0 · AI & Automation · score 73
Install: claude install-skill omeyang/Thoth
# Go 幂等性处理专家 使用 Go 实现幂等性处理:$ARGUMENTS --- ## 1. 幂等性基础 ### 天然幂等 vs 需要保护 | 操作 | 天然幂等 | 说明 | |------|---------|------| | GET /users/123 | Y | 读取操作 | | PUT /users/123 | Y | 全量替换 | | DELETE /users/123 | Y | 删除操作 | | POST /orders | N | 需要幂等保护 | | POST /payments | N | 需要幂等保护 | | PATCH /users/123 | N | 增量更新可能不幂等 | --- ## 2. 幂等键设计 - **客户端生成**:HTTP Header `Idempotency-Key`,推荐 UUID v4 或 ULID - **服务端生成**:`GenerateIdempotencyKey(userID, operation, payload)` - 基��业务字段 SHA256 哈希 - **业务字段生成**:`IdempotencyKey()` 方法,含时间窗口(如每天可重复) --- ## 3. 存储策略 ### Redis 存储(推荐用于简单场景) - `IdempotencyRecord{Status, Response, StatusCode, Error, CreatedAt, ExpiresAt}` - `TryAcquire(ctx, key)` - SET NX 原子获取处理权,返回 (record, acquired, error) - `Complete(ctx, key, statusCode, response)` - 标记完成 - `Fail(ctx, key, err)` - 标记失败 - `Release(ctx, key)` - 释放处理权(异常情况) ### PostgreSQL 存储(推荐用于事务场景) - DDL:`idempotency_keys` 表,`INSERT ON CONFLICT DO NOTHING` 实现原子获取 - `CompleteInTx(ctx, tx, key, statusCode, response)` - 在同一事务中完成 --- ## 4. 中间件实现 - `IdempotencyMiddleware.Wrap(next)` - HTTP 中间件 - 仅对非幂等方法(POST/PATCH)启用 - 无 Idempotency-Key 则正常处理 - processing 状态返回 409 Conflict + Retry-After - completed 状态返回缓存响应 + `X-Idempotency-Replayed: true` - failed 状态返回错误,允许重试 - `responseWriter` 捕获状态码和响应体 --- ## 5. 业务层幂等 ### 订单创建流程 1. 获取/生成幂等键 2. `TryAcquire` 获取处理权 3. 未获取 -> `handleExistingOrder`(按 status 返回) 4. 获取 -> 开启事务 -> 创建订单 -> `CompleteInTx`(同事务)-> Commit 5. 失败 -> Rollback + `Fail` --- ## 6. 消息幂等 - **Kafka 消费者**:幂等键 = `kaf