Le serveur d'API gRPC via Python ne peut pas fonctionner
J'ai développé le serveur d'API gRPC via Python, puis le construire en conteneur et le déployer sur Cloud Run,
Lequel mon serveur gRPC s'intègre à l'application TensorFlow. En fait, le tensorflow pour l'image ML, mais c'est un exemple de code par exemple à discuter.
class Calculator(calculator_pb2_grpc.CalculatorServiecer):
def Calculate(self, request, context):
try:
# Processing
return #protobuf message
except Exception as e:
logging.error(e)
def main():
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
calculator_pb2_grpc.add_CalculatorServiecer_to_server(Calculator(), server)
server.add_insecure_port('[::]:8080')
server.start()
logging.info("Listening on %s.", '8080')
server.wait_for_termination()
if __name__ == '__main__':
main()
Mais j'ai toujours une erreur lorsque j'appelle le gRPC comme
gRPC status code 14
ERROR:root:<_InactiveRpcError of RPC that terminated with:
status = StatusCode.UNAVAILABLE
details = "Socket closed"
ERROR:root:<_InactiveRpcError of RPC that terminated with:
status = StatusCode.UNAVAILABLE
details = "Connection reset by peer"
Quelqu'un que j'ai une idée? Parce que lorsque je teste sur l'hôte local, tout fonctionne, même dans le conteneur Docker peut toujours fonctionner, mais lorsque tout sur Cloud Run s'est effondré.
Je ne sais pas quelle est la cause première de ce problème. Cela pourrait être keepalive ou timeout?
J'essaie beaucoup de choses sur le canal de connexion, je change mon nom d'hôte en
{HOST}:443
S'il vous plaît aider, merci
Exemple de code client
Je construis l'application client en tant que serveur d'API REST pour appeler un gRPC externe.Ce serveur d'API REST est également déployé sur Cloud Run.
CHANNEL = grpc.insecure_channel('<CLOUD_RUN_DOMAIN_WITHOUT_HTTP>:443')
STUB = calculator_pb2_grpc.CalculatorStub(CHANNEL)
@app.get("/add") # passing value via query string
def index_dest(first : float, second : float):
try:
res = STUB.Calculate(calculator_pb2.BinaryOperation(first_operand=first,second_operand=second,operation="ADD"))
return {"message" : res}
except Exception as e:
logging.error(e)
Réponses
De https://cloud.google.com/run/docs/issues#grpc_websocket:
Cloud Run (entièrement géré) ne prend actuellement pas en charge la diffusion HTTP. Par conséquent, les demandes entrantes avec des protocoles tels que WebSockets et le streaming gRPC ne sont pas prises en charge.