This example shows how to enable and configure retry on gRPC clients.
gRFC for client-side retry support
This example includes a service implementation that fails requests three times with status code Unavailable
, then passes the fourth. The client is configured to make four retry attempts when receiving an Unavailable
status code.
First start the server:
go run server/main.go
Then run the client. Note that when running the client, GRPC_GO_RETRY=on
must be set in your environment:
GRPC_GO_RETRY=on go run client/main.go
Retry is enabled via the service config, which can be provided by the name resolver or a DialOption (described below). In the below config, we set retry policy for the “grpc.example.echo.Echo” method.
MaxAttempts: how many times to attempt the RPC before failing. InitialBackoff, MaxBackoff, BackoffMultiplier: configures delay between attempts. RetryableStatusCodes: Retry only when receiving these status codes.
var retryPolicy = `{
"methodConfig": [{
// config per method or all methods under service
"name": [{"service": "grpc.examples.echo.Echo"}],
"waitForReady": true,
"retryPolicy": {
"MaxAttempts": 4,
"InitialBackoff": ".01s",
"MaxBackoff": ".01s",
"BackoffMultiplier": 1.0,
// this value is grpc code
"RetryableStatusCodes": [ "UNAVAILABLE" ]
}
}]
}`
To use the above service config, pass it with grpc.WithDefaultServiceConfig
to grpc.Dial
.
conn, err := grpc.Dial(ctx,grpc.WithInsecure(), grpc.WithDefaultServiceConfig(retryPolicy))