Der gRPC-API-Server über Python funktioniert nicht

Aug 25 2020

Ich habe den gRPC-API-Server über Python entwickelt und ihn dann als Container erstellt und auf Cloud Run bereitgestellt.

Welche meine gRPC-Server in die TensorFlow-Anwendung integrieren. Eigentlich ist der Tensorflow für Bild ML, aber dies ist ein Beispielcode, um zum Beispiel zu diskutieren.

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

Aber ich habe immer Fehler, wenn ich den gRPC wie aufrufe

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"

Hat jemand eine Idee? Denn wenn ich auf localhost teste, funktioniert alles, auch in Docker-Container kann noch funktionieren, aber wenn alles auf Cloud Run zusammengebrochen ist.

Ich bin mir nicht sicher, was die Hauptursache für dieses Problem ist. Es könnte Keepalive oder Timeout sein?

Ich versuche viele Dinge auf dem Verbindungskanal, in den ich meinen Hostnamen ändere

 {HOST}:443

Bitte helfen Sie, danke

Beispiel für einen Client-Code

Ich erstelle die Clientanwendung als REST-API-Server zum Aufrufen von externem gRPC. Dieser REST-API-Server wird auch bei Cloud Run bereitgestellt.

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)

Antworten

DustinIngram Aug 25 2020 at 11:04

Von https://cloud.google.com/run/docs/issues#grpc_websocket::

Cloud Run (vollständig verwaltet) unterstützt derzeit kein HTTP-Streaming. Daher eingehende Anforderungen mit Protokollen wie WebSockets und gRPC Streaming werden nicht unterstützt.