背景 在微服务里,重试是常态;没有幂等,重试就会制造脏数据。
常见重复来源:
客户端重复点击 网关超时后自动重试 消息队列重复投递 一种常见实现 以幂等 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 } 总结 幂等设计本质是在失败重试下维持业务语义稳定。
关键是“唯一键 + 状态机 + 可重放结果”。
高可用系统默认会重试,幂等就是重试的安全带。