什么是错误重试策略
在网络请求中会遇到各式各样的错误,比如DNS服务、负载均衡等都有可能导致一次请求的失败,这些都是不可控的,因此常见的解决方案就是在客户端上做重试,来增加应用的可靠性,将少开发者的开销。
每个亚马逊云服务的SDK都做了原子的重试策略,并且自动配了重试策略,感兴趣可以看AWS配置类ClientConfiguration。(在配置中只要把ClientConfiguration.maxErrorRetry
设为0即可关掉重试策略)
如果你没有使用官方SDK,可以自己在客户端包装一些对5xx或Throtting类的错误做重试,但对4xx类的客户端错误则不应重试。(要先改掉出错的请求)
指数回退算法
AWS SDK用了指数回退算法(Exponential backoff algorithm)来控制重试,这个算法的思路是在每次重试之间的等待时间越来越长,来应对持续不断的错误。 要实现一个重试,需要一个可以配置的最大重试请求间隔和最大重试次数,这些值要基于请求的性能,也要考虑到网络延迟等。
大部分指数回退算法使用jitter(随机的延迟)来避免连续的冲突。如果你不是要避免这类冲突,你也不需要使用这个随机。然而,如果你有并发的client请求,jitter可以帮助你的请求更容易成功。需要更多信息请参见这个博客Exponential Backoff and Jitter。
以下是一个伪代码来说明AWS的重试做法:
Do some asynchronous operation.
retries = 0
DO
wait for (2^retries * 100) milliseconds
status = Get the result of the asynchronous operation.
IF status = SUCCESS
retry = false
ELSE IF status = NOT_READY
retry = true
ELSE IF status = THROTTLED
retry = true
ELSE
Some other error occurred, so stop calling the API.
retry = false
END IF
retries = retries + 1
WHILE (retry AND (retries < MAX_RETRIES))