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?
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
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.