面试题答案
一键面试重试策略
- 重试间隔时间设置:采用指数退避算法,即每次重试的间隔时间以指数级增长。例如,初始间隔时间设为1秒,下一次重试间隔为2秒,再下一次为4秒,以此类推。这样做的好处是在初始阶段能够快速进行重试,随着重试次数增加,间隔时间增大,避免短时间内对发送端和接收端造成过大压力。
- 最大重试次数考量:根据业务场景来设定最大重试次数。如果是对消息准确性要求极高且消息发送失败影响较大的场景,如金融交易消息,可适当设置较大的重试次数,比如10 - 20次;如果是一般性的通知消息,重试次数可设为5 - 10次。设置最大重试次数主要是为了防止无限重试,消耗过多资源。
- 避免重试风暴:
- 随机化重试间隔:在指数退避的基础上,对重试间隔时间添加一定的随机因子。例如,在计算出的间隔时间(如4秒)基础上,随机增减1 - 2秒。这样不同消息的重试时间会分散开,避免大量消息在同一时间重试,形成重试风暴。
- 分组重试:将消息按照一定规则分组,如按照接收方、消息类型等。每组设置不同的重试起始时间,使得不同组的消息重试时间错开,降低集中重试的可能性。
设计背后原理
- 指数退避:通过指数级增长间隔时间,随着重试次数增加,给予系统更多时间恢复或处理导致消息发送失败的问题,同时也避免频繁重试对网络和服务造成过大冲击。
- 最大重试次数:防止因不可恢复的错误(如接收方永久不可达)导致程序陷入无限重试循环,浪费系统资源。
- 随机化与分组重试:随机化重试间隔打破重试时间的一致性,分组重试将重试分散到不同的“批次”,两者都能有效避免大量消息同时重试,防止重试风暴,保证系统的稳定性和可用性。