当咱们链接到一个失败的后端时,一般但愿不要当即重试(以免泛滥的网络或服务器的请求),而是作某种形式的指数backoff。golang
咱们有几个参数:算法
以指数形式返回链接尝试的起始时间,达到MAX_BACKOFF的极限,并带有抖动。后端
1 |
ConnectWithBackoff() |
参数默认值MIN_CONNECT_TIMEOUT
=20sec INITIAL_BACKOFF
=1sec MULTIPLIER
=1.6 MAX_BACKOFF
=120sec JITTER
=0.2服务器
根据的确切的关注点实现(例如最小化手机的唤醒次数)可能但愿使用不一样的算法,特别是不一样的抖动逻辑。网络
备用的实现必须确保链接退避在同一时间开始分散,而且不得比上述算法更频繁地尝试链接。dom
backoff应在某个时间点重置为INITIAL_BACKOFF
,以便从新链接行为是一致的,无论链接的是新开始的仍是先前断开的链接。google
当接收到SETTINGS
帧时重置backoff,在那个时候,咱们肯定这个链接被服务器已经接受了。spa
源码位于google.golang.org/grpc/backoff
,代码很少,直接在代码上分析。code
1 |
|
若是默认的backoff算法不知足需求的时候,还能够自定义backoff算法,经过实现backoffStrategy接口。orm
1 |
func withBackoff(bs backoffStrategy) DialOption { |