指数退避和抖动故事

“指数退避,你等着瞧!!”
“什么?那是什么技术!?”

看来接下来要发生一件令人费解的事……不过,
感谢你们的辛勤付出。
我是系统开发部的“活死人”松山。

我本想时隔许久更新一下我的博客,但
我没有精力编写一些示例代码并做出一些可以运行的东西,所以
这次我将写一篇关于一个小算法的文章。

例如

当客户端与服务器通信期间服务器返回错误时,
客户端可能采取以下行为:

① 显示错误信息并取消进程
② 再次执行相同的通信(重试)
③ 进程无法继续

③ 只是一个 bug,所以肯定不行,但我认为大多数情况会是 ① 或 ②。
特别是对于处理过程不能中断的流程,我认为你会希望通过 ② 来恢复。

重试

我们来思考一下重试机制。

如果仅仅
因为响应出错就重试如果服务器端出现问题,
所有用户都会不断重试,这可能
:服务器负载急剧上升(这种情况与拒绝服务攻击无异),最终导致服务器宕机

我至今还对这种事记忆犹新……

用于分配如此高负载的算法
是开头提到的“指数退避算法”。

指数退避

从字面上讲,
指数
退避
是一种以指数方式递减(延迟)重试间隔的算法。

如果发生错误,重试
1 秒、2 秒、4 秒、8 秒等
,从而减少重试的总次数,实现高效的重试。

AWS 也对此有所解释。AWS
解释

抖动

然而,简单的指数函数可能会导致大量并发请求
(因为同时访问的用户会使用相同的重试间隔)
。这就是为什么指数函数需要配合“抖动”使用。
顾名思义
,抖动就等于时间延迟

通过使用随机值来设定重试间隔的范围,可以分散同时发生的重试。

AWS 解决方案架构师博客上的一篇文章
提供了验证结果的详细摘要

概括

实际上,你需要考虑诸如最大重试次数和超时之类的事情,但
这次我们只引入指数退避和抖动。

如果遇到暂时性错误或故障,重试通常可以解决问题。
如果恢复需要一些时间,
,通过执行此处介绍的高效重试
系统造成不必要压力的情况下改善情况。

顺便说一句,

我用开场白开了个小玩笑,想吸引观众的注意力,因为我听到有人说: “指数退避听起来像是一个特殊招式。”

很简单,但今天就先说到这里吧。

如果您觉得这篇文章有帮助,请点赞!
16
加载中...
16 票,平均:1.00 / 116
6,476
X Facebook 哈特纳书签 口袋

写这篇文章的人

关于作者

松山贤章

他长期在一家游戏开发公司工作,从事程序和项目管理工作。
2019年加入超越株式会社。
在横滨办事处工作。 主要负责服务器端开发工作的项目管理。
(有时编程)我的爱好是骑自行车(公路赛车)和观看赛马。