你想知道的重试都在这里

2021-11-17  本文已影响0人  小青菜的技术博客

1. 背景

1.1 问题的背景

类似组件和服务瞬间断开网络连接、服务暂时不可用,或者当服务繁忙时出现超时等这些临时性故障,这些临时性故障通常可以自己修复(延迟合适时间重新触发请求,该请求可能成功)

1.2 常见的错误处理方案

1.2.1 终止操作,返回错误信息,记录错误日志

如果错误表明故障不是暂时性的或者重新执行也不可能成功的。如密码错误等操作问题

1.2.2 重试

1.3 重试的问题和注意事项

2. 重试相关的策略

2.1 比较重要的三个参数:重试次数、调用间隔、总延时

2.2 常见的重试策略

2.3 退避策略(backoff)

2.4 兜底恢复策略(recover)

2.5 Google的SRE给出的一些实践建议

2.6 backup requests策略:主要用于解决长尾请求

客户端可以根据过去一个时间窗口内的请求时长的pct999,判断大多数正常请求的耗时分布,当请求耗时已经达到这个阈值(在各个场景下,这个值都小于超时阈值),不必等请求返回而直接重试,这种策略叫做backup requests。在超时出现比较多的场景下,这种提早重试策略能够提升服务的响应速度,所带来的代价就是可能出现的一些额外请求

3. 重试的场景

3.1 Http、Https协议下的重试--HttpClient

3.2 RPC框架的重试--Dubbo的重试机制(v2.6.x)

3.3 MQ消息--RocketMQ的重试机制

3.3.1 消息发送阶段

3.3.2 消费消息阶段

手动提交+自动重试(次数有限制),重试次数用完了怎么办,会进入死信队列

4. 重试的风险与预防** 重试存在放大故障的风险,那如何防止放大故障的风险

4.1 限制单点重试与正常请求的比例

针对整个客户端的调用,设置最大的重试与请求的比例。即重试请求最大不会超过某个时间窗口内的请求数的10%,即写放大指数最大就是110%。-----来源Google SRE的建议

we implement a per-client retry budget. Each client keeps track of the ratio of requests that correspond to retries. A request will only be retried as long as this ratio is below 10%. The rationale is that if only a small subset of tasks are overloaded, there will be relatively little need to retry.https://sre.google/sre-book/handling-overload/

4.2 限制链路重试

4.2.1 在微服务中对于重试的实践中,具体在哪层操作重试?

4.3 超时时间配置问题

如果A->B重试成功了,但此时已经超时了怎么办,这不等于白重试了吗 ---- 问题出在超时时间配置的不合理

4.3.1 backup requests方案

backup requests方案的思想就是提前重试,用访问量来换成功率(或者说低延时)的思想,这样机制能大大减少整体延时,这个机制也必须同样遵循重试与正常请求的比例

4.3.2 基于trace推荐超时时间配置

基于对链路的监控,结合上下游情况来计算推荐的超时时间配置

5. 重试组件

6. 重试相关的常见故障

7. 参考文章

上一篇下一篇

猜你喜欢

热点阅读