Le serveur d'API gRPC via Python ne peut pas fonctionner

Aug 25 2020

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

DustinIngram Aug 25 2020 at 11:04

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.