Variables

  1. var (
  2. DefaultRetriableCodes = []codes.Code{codes.ResourceExhausted, codes.Unavailable}
  3. )

func StreamClientInterceptor(optFuncs …CallOption) grpc.StreamClientInterceptor
返回一个新的重试的客户端流拦截器
func UnaryClientInterceptor(optFuncs …CallOption) grpc.UnaryClientInterceptor
返回一个新的重试的一元客户端拦截器

type BackoffFunc

BackoffFunc表示控制调用重试之间的回退持续时间的一系列函数

  1. type BackoffFunc func(attempt uint) time.Duration

func BackoffExponential(scalar time.Duration) BackoffFunc

  • 为每一次尝试产生递增的间隔。标量乘以2的当前尝试次数。因此,第一个标量为100ms的重试是100ms,而第5次尝试是1.6s。

func BackoffExponentialWithJitter(scalar time.Duration, jitterFraction float64) BackoffFunc

  • 同BackoffExponential,但增加了jitterFraction抖动,jitterFraction的单位是秒

func BackoffLinear(waitBetween time.Duration) BackoffFunc 在重试间等待一段固定时间
func BackoffLinearWithJitter(waitBetween time.Duration, jitterFraction float64) BackoffFunc

  • 同 BackoffLinear,但增加了jitterFraction抖动,jitterFraction的单位是秒
  • 例如,waitBetween=1和jitter=0.10可以生成900ms到1100ms之间的等待。


type CallOption

CallOption is a grpc.CallOption
func Disable() CallOption
func WithBackoff(bf BackoffFunc) CallOption 用于控制重试间隔时间
func WithCodes(retryCodes …codes.Code) CallOption
func WithMax(maxRetries uint) CallOption
func WithPerRetryTimeout(timeout time.Duration) CallOption

例子:

  1. conn, err := grpc.Dial("",grpc.WithInsecure(),
  2. // 开启 grpc 中间件的重试功能
  3. grpc.WithUnaryInterceptor(
  4. grpc_retry.UnaryClientInterceptor(
  5. grpc_retry.WithBackoff(grpc_retry.BackoffLinear(time.Duration(1)*time.Millisecond)), // 重试间隔时间
  6. grpc_retry.WithMax(3), // 重试次数
  7. grpc_retry.WithPerRetryTimeout(time.Duration(5)*time.Millisecond), // 重试时间
  8. // 返回码为如下值时重试
  9. grpc_retry.WithCodes(codes.ResourceExhausted, codes.Unavailable, codes.DeadlineExceeded),
  10. ),
  11. ),
  12. )
  13. client := pb_testproto.NewTestServiceClient(conn)
  14. pong, _ := client.Ping(
  15. ctx,
  16. &pb_testproto.PingRequest{},
  17. grpc_retry.WithMax(3),
  18. grpc_retry.WithPerRetryTimeout(1*time.Second))