背景
在微服务里,重试是常态;没有幂等,重试就会制造脏数据。
常见重复来源:
- 客户端重复点击
- 网关超时后自动重试
- 消息队列重复投递
一种常见实现
以幂等 key 做唯一约束,先查后写或直接 UPSERT。
type IdempotencyRecord struct {
Key string
Status string
ResultRef string
}
func (s *OrderService) CreateOrder(ctx context.Context, key string, req *CreateReq) (*Order, error) {
if rec, ok := s.repo.FindByKey(ctx, key); ok {
return s.repo.FindOrder(ctx, rec.ResultRef)
}
order, err := s.repo.CreateOrderWithKey(ctx, key, req)
if err != nil {
return nil, err
}
return order, nil
}
总结
幂等设计本质是在失败重试下维持业务语义稳定。
关键是“唯一键 + 状态机 + 可重放结果”。
高可用系统默认会重试,幂等就是重试的安全带。