NOTE
2.6 如何设计超时与重试系统
1. 超时重试是什么 - 超时:服务A调用服务B,为了防止服务A请求服务B但是一直没有响应,导致服务A的线程等资源一直hold着无法释放,因此需要设置超时 - 重试:服务A调用服务B,如果服务A请求服务B发生了网络错误,那么会触发超时,但是这个网络是暂时的,因此重试几次可能就好了 2. 怎么设计超时
这是历史学习笔记,可能存在过时或不完整的理解。
1. 超时重试是什么
- 超时:服务A调用服务B,为了防止服务A请求服务B但是一直没有响应,导致服务A的线程等资源一直hold着无法释放,因此需要设置超时
- 重试:服务A调用服务B,如果服务A请求服务B发生了网络错误,那么会触发超时,但是这个网络是暂时的,因此重试几次可能就好了
2. 怎么设计超时重试
2.1. 超时
2.1.1. 超时时长
- 刚上线的服务通过压测:一般N个9的耗时为200ms时,取平均耗时做超时时间
- 已有的服务通过监控:平均响应时间
2.2. 重试
2.2.1. 什么错误可以重试
- 调用超时、被调用端返回了某种可以重试的错误(如繁忙中、流控中、维护中、资源不足等)
2.2.2. 重试的策略
- 指数级退避
- 重置超时时间
2.2.3. 重试的前提
- 被调是幂等的
2.2.4. 重试次数
- 压测计算最大支持的并发度是多少
- 如果上游有传递时间,那么根据这个时间来确定重试次数,否则走默认值,比如Linux TCP重试次数为5次
3. 超时重试组件
- 如何设计容错组件.md(关联笔记尚未公开)