web-dev-qa-db-fra.com

Problème avec la configuration de gRPC. Obtention d'une erreur RPC intermittente indisponible

J'ai un serveur et un client grpc qui fonctionnent comme prévu la plupart du temps, mais j'obtiens parfois une erreur "transport se ferme":

rpc error: code = Unavailable desc = transport is closing

Je me demande si c'est un problème avec ma configuration. Le client est assez basique

connection, err := grpc.Dial(address, grpc.WithInsecure(), grpc.WithBlock())
pb.NewAppClient(connection)
defer connection.Close()

et les appels sont effectués avec un délai comme

ctx, cancel := context.WithTimeout(ctx, 300*time.Millisecond)
defer cancel()

client.MyGRPCMethod(ctx, params)

Une autre chose que je fais est de vérifier la connexion pour voir si elle est ouverte, inactive ou en cours de connexion, et de réutiliser la connexion si c'est le cas. Sinon, recomposition.

Rien de spécial ne se passe avec le serveur

grpc.NewServer()

Y a-t-il des erreurs courantes lors de la configuration d'un client/serveur grpc que je pourrais faire?

6
harumphfrog

Une autre chose que je fais est de vérifier la connexion pour voir si elle est ouverte, inactive ou en cours de connexion, et de réutiliser la connexion si c'est le cas. Sinon, recomposition.

grpc gérera vos connexions pour vous, se reconnectant si nécessaire, vous ne devriez donc jamais avoir besoin de le surveiller après l'avoir créé, sauf si vous avez des besoins très spécifiques.

"le transport se ferme" a de nombreuses raisons différentes de se produire; veuillez consulter la question pertinente dans notre FAQ et faites-nous savoir si vous avez encore des questions: https://github.com/grpc/grpc-go#the-rpc-failed -with-error-code - non disponible-desc - transport-is-closing

2
Doug Fawley

J'ai eu à peu près le même problème plus tôt cette année . Après environ 15 menuets, des serveurs ont fermé la connexion.

Ma solution qui fonctionnait était de créer mon connection avec grpc.Dial Une fois sur ma fonction main puis de créer la pb.NewAppClient(connection) à chaque demande. Étant donné que connection était déjà créé, la latence n'était pas un problème. Une fois la demande terminée, j'ai fermé le client.

1
Varcorb