El servidor API gRPC a través de Python no puede funcionar

Aug 25 2020

Desarrollé el servidor API gRPC a través de Python, luego lo construí en un contenedor y lo implementé en Cloud Run,

Que mi servidor gRPC está integrando con la aplicación TensorFlow. En realidad, el flujo de tensor para la imagen ML, pero este es un código de ejemplo para discutir.

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() 

Pero siempre recibo un error cuando llamo al gRPC como

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"

Alguien tengo idea? Porque cuando pruebo en localhost todo funciona, incluso en el contenedor docker todavía puede funcionar, pero cuando todo en Cloud Run colapsa.

No estoy seguro de cuál es la causa raíz de este problema. ¿Podría ser keepalive o timeout?

Intento muchas cosas, como en el canal de conexión, cambio mi nombre de host a

 {HOST}:443

Por favor ayuda, gracias

Ejemplo de código de cliente

Construyo la aplicación cliente como servidor API REST para llamar a gRPC externo. Este servidor API REST también se implementa en 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)

Respuestas

DustinIngram Aug 25 2020 at 11:04

Dehttps://cloud.google.com/run/docs/issues#grpc_websocket:

Cloud Run (totalmente administrado) actualmente no admite la transmisión HTTP. Por lo tanto, no se admiten las solicitudes entrantes con protocolos como WebSockets y gRPC streaming.