Python aracılığıyla gRPC API sunucusu çalışmıyor

Aug 25 2020

GRPC API sunucusunu Python aracılığıyla geliştirdim, ardından onu kapsayıcıya derledim ve Cloud Run üzerinde dağıtın

Hangi gRPC sunucum TensorFlow uygulamasıyla entegre oluyor. Aslında görüntü ML için tensorflow, ancak bu, örneğin tartışmak için örnek bir koddur.

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

Ama gRPC'yi şöyle çağırdığımda her zaman hata alıyorum

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"

Bir fikrim var mı? Çünkü localhost üzerinde test ettiğimde her şey çalışıyor, hatta docker container'da bile çalışabilir, ancak Cloud Run'daki her şey çöktüğünde.

Bu sorunun temel nedeninin ne olduğundan emin değilim. Kalıcı mı yoksa zaman aşımı mı?

Bağlantı kanalında birçok şey deniyorum, ana bilgisayar adımı şu şekilde değiştiriyorum

 {HOST}:443

Lütfen yardım edin, teşekkür ederim

Örnek Müşteri Kodu

İstemci uygulamasını harici gRPC'yi çağırmak için REST API sunucusu olarak derliyorum, Bu REST API sunucusu da Cloud Run üzerinde konuşlandır.

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)

Yanıtlar

DustinIngram Aug 25 2020 at 11:04

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

Cloud Run (tümüyle yönetilen) şu anda HTTP akışını desteklemiyor. Bu nedenle, WebSockets ve gRPC akışı gibi protokollere sahip gelen istekler desteklenmez.