网络不稳定、依赖服务异常时,合理的重试机制能提高系统成功率。但不加控制的重试会放大流量,造成雪崩。
1. 重试的必要性
- 网络瞬时抖动。
- 下游服务超时或短暂不可用。
- 数据库连接中断。
2. 重试的设计原则
- 有限次数:建议3次以内,防止放大流量。
- 退避间隔:使用指数退避(1s、2s、4s…),避免同时重试。
- 超时控制:每次请求设置独立超时。
- 幂等保障:确保重试不会产生副作用。
3. 幂等性实现方式
- 请求唯一ID:同一请求多次执行只生效一次。
- 数据库唯一约束:防止重复插入。
- 状态检查:仅在允许状态下执行更新。
4. 异常分类重试
- 可重试异常:超时、临时错误、网络失败。
- 不可重试异常:参数错误、逻辑异常。
- 幂等失败:需人工干预。
5. 工程实践
- HTTP请求层:配合断路器,重试间隔控制。
- 消息队列:消费失败后延迟重试。
- 数据库层:短暂锁等待可尝试重连。
结论:重试机制应精准、有限、可控。幂等性是其安全网。两者结合,让系统既能“自愈”,又不“自毁”。