背景

在微服务里,重试是常态;没有幂等,重试就会制造脏数据。

常见重复来源:

  • 客户端重复点击
  • 网关超时后自动重试
  • 消息队列重复投递

一种常见实现

以幂等 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
}

总结

幂等设计本质是在失败重试下维持业务语义稳定。

关键是“唯一键 + 状态机 + 可重放结果”。


高可用系统默认会重试,幂等就是重试的安全带。