分布式重试设计

64 阅读1分钟

单体架构变成微服务架构,会涉及到网络上的问题,具有不稳定性,数据传输过程中,只要任何一个环节出现问题,都会影响系统的稳定性。

重试场景

需要重试:调用超时,被调用端返回某种可以重试的错误(繁忙中,流控中,维护中,资源不足)

不需要重试:业务级错误(没有权限,非法数据),技术上的错误(http503)

重试策略

给重试机制设置一个重试最大值,超过最大值就没必要重试。每一次重试失败,都休息一段时间,每次一次的休息时间都会成倍增加,避免网络上的消耗负担。

实现重试机制

Golang 中,虽然没有像 Spring Retry 这样的官方库,但通过使用第三方库,完全可以实现类似的重试机制:

  • retry-go:灵活的重试配置,适合一般的重试需求。
  • backoff:指数退避重试策略,适用于需要避免频繁请求的场景。
  • stack:错误追踪功能,帮助诊断重试过程中的错误。

这些库都有非常好的文档和社区支持,能帮助你在 Golang 中实现灵活的重试机制,解决临时错误和业务恢复问题。

重试设计

  • 确定什么样的错误需要重试
  • 重试的时间和次数
  • 超过重试次数,或一段时间
  • 重试还要考虑幂等性
  • 重试的代码通用,不需要侵入到业务代码
  • 有事务相关的操作,最好是能重试成功,不至于走业务补偿流程