单体架构变成微服务架构,会涉及到网络上的问题,具有不稳定性,数据传输过程中,只要任何一个环节出现问题,都会影响系统的稳定性。
重试场景
需要重试:调用超时,被调用端返回某种可以重试的错误(繁忙中,流控中,维护中,资源不足)
不需要重试:业务级错误(没有权限,非法数据),技术上的错误(http503)
重试策略
给重试机制设置一个重试最大值,超过最大值就没必要重试。每一次重试失败,都休息一段时间,每次一次的休息时间都会成倍增加,避免网络上的消耗负担。
实现重试机制
在 Golang 中,虽然没有像 Spring Retry 这样的官方库,但通过使用第三方库,完全可以实现类似的重试机制:
retry-go:灵活的重试配置,适合一般的重试需求。backoff:指数退避重试策略,适用于需要避免频繁请求的场景。stack:错误追踪功能,帮助诊断重试过程中的错误。
这些库都有非常好的文档和社区支持,能帮助你在 Golang 中实现灵活的重试机制,解决临时错误和业务恢复问题。
重试设计
- 确定什么样的错误需要重试
- 重试的时间和次数
- 超过重试次数,或一段时间
- 重试还要考虑幂等性
- 重试的代码通用,不需要侵入到业务代码
- 有事务相关的操作,最好是能重试成功,不至于走业务补偿流程