连接失败时,通常会有重试的功能,backoff就是用来干这个的,默认为DefaultConfig

Variables

  1. var DefaultConfig = Config{
  2. BaseDelay: 1.0 * time.Second,
  3. Multiplier: 1.6,
  4. Jitter: 0.2,
  5. MaxDelay: 120 * time.Second,
  6. }

type Config

  1. type Config struct {
  2. // 第一次失败后退出的时间
  3. BaseDelay time.Duration
  4. // 递增因子
  5. Multiplier float64
  6. // 随机抖动的范围
  7. Jitter float64
  8. // 重试时间的上线
  9. MaxDelay time.Duration
  10. }

当我们连接到一个失败的后端时,通常希望不要立即重试(以避免泛滥的网络或服务器的请求),而是做某种形式的指数backoff

demo

  1. func main() {
  2. connectParams := grpc.ConnectParams{
  3. Backoff:backoff.Config{
  4. // 第一次失败后退出的时间
  5. BaseDelay:5*time.Second,
  6. // 递增因子
  7. Multiplier :2.0,
  8. // 随机抖动的范围
  9. Jitter:1.0,
  10. // 重试时间的上线,这个会影响到失败节点上线后重新开始服务的时间
  11. MaxDelay :120*time.Second,
  12. },
  13. // 希望的拿到连接的最短时间,一般Backoff用默认的就行,直接再设置一个最短时间,过多少秒后才去尝试获取连接
  14. MinConnectTimeout : 10*time.Second,
  15. }
  16. conn, err := grpc.Dial(address, grpc.WithInsecure(),grpc.WithConnectParams(connectParams))
  17. defer conn.Close()
  18. }