如何降低服务失败率,提高服务稳定性 -- 双发策略[重试机制]

Posted 魏小言

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何降低服务失败率,提高服务稳定性 -- 双发策略[重试机制]相关的知识,希望对你有一定的参考价值。


如何降低服务失败率,提高服务稳定性 – 双发策略[重试机制]

谈论评估一个服务的性能时,核心指标有 QPS、耗时、失败率…等等,其中 “失败率” 体现了服务的稳定性能,更意味着全年可服务时长…

如何能够降低服务失败率,提高服务稳定性呢?

谈论失败率的前提

在现分布式的架构中,产品功能往往分解为多个边界清晰的服务模块,各模块独立部署,共同提供功能支撑。

服务之间相互通信时,由于读写耗时、网络、机器IO…等各种因素,会导致服务某时刻无响应,也就是通信失败。正是因为失败的因素多样,所以谈及失败率多少,比带着一些前提条件进行约束因素。

举个例子:

在整个服务中,体系结构为上游服务 A 调用 下游服务 B 。由于接口平响业务规范,对 B 服务的读写约束在 20ms 内,超过约束时间,则视为通信失败。于是就有了下面的描述:
对于 服务 A 来说,

  • 读写时间设置为 20ms 时,服务 B 的失败率是 0.3%,千分之三;
  • 读写时间设置为 50ms 时,服务 B 的失败率是 0.1%,千分之一;

所以就产生了一个问题,如何在约束条件下降低服务通信的失败率?
如何在读写时间设置为 20ms 时,把服务 B 的失败率将到 0.1%,千分之一呢?

重试

其实采取的措施有多种,重试是大家平时用到的最普遍的措施之一。

为什么重试可以有效降低失败率呢?

这要归结一下通信失败的原因。大数据显示,服务通信失败 90%+ 的因素为网络问题,也就意味着通信次数和成功率成正比。故就有了这一重试机制。

重试机制的策略有多种,具体详细可见 你真的会重试吗?——重试机制之二进制指数退避机制

这里介绍一种双发机制。

双发

所谓双发,顾名思义,就是一次通信进行两次交互。两次交互相差一定的时差,避免阶段性网络抖动,以其中一次的通信结果为基准。

Weibo 跨平台服务治理服务 Motan 支持此双发机制,具体流程如图:

在通信时,第一次请求发送到 服务 B 的 P90 时间内,仍未收到相应,则进行第二次发送,最终以先到的响应为准。

注: P90/99/999,可配置,数据表明通用场景P90效果最佳

附录

忙碌与早起

以上是关于如何降低服务失败率,提高服务稳定性 -- 双发策略[重试机制]的主要内容,如果未能解决你的问题,请参考以下文章

传统企业DevOps与微服务如何落地?QCon北京大会揭晓!

微服务架构的稳定性与数据一致性能如何快速提高?

一种提高微服务架构的稳定性与数据一致性的方法

举个栗子 | 提高微服务架构的稳定性与数据一致性的方法

微服务之Polly熔断策略

提高CUI测试稳定性技术