Servidor de API gRPC via Python não pode funcionar

Aug 25 2020

Desenvolvi o servidor gRPC API via Python, depois construí-o em contêiner e implantei no Cloud Run,

Qual meu servidor gRPC está integrando com o aplicativo TensorFlow. Na verdade, o tensorflow para imagem ML, mas este é um código de exemplo para discussão.

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

Mas sempre recebo um erro ao chamar o 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"

Alguém que eu tenha ideia? Porque quando eu testo no localhost, tudo funciona, mesmo no contêiner docker ainda pode funcionar, mas quando tudo no Cloud Run entra em colapso.

Não tenho certeza qual é a causa raiz desse problema. Pode ser keepalive ou timeout?

Eu tento muitas coisas como no canal de conexão, eu mudo meu nome de host para

 {HOST}:443

Por favor me ajude, obrigado

Exemplo de código do cliente

Eu construo o aplicativo cliente como servidor de API REST para chamar o gRPC externo. Este servidor de API REST também é implantado no 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)

Respostas

DustinIngram Aug 25 2020 at 11:04

A partir dehttps://cloud.google.com/run/docs/issues#grpc_websocket:

No momento, o Cloud Run (totalmente gerenciado) não é compatível com streaming HTTP. Portanto, solicitações de entrada com protocolos como WebSockets e streaming gRPC não são suportadas.