Server API gRPC melalui Python tidak dapat berfungsi

Aug 25 2020

Saya telah mengembangkan server API gRPC melalui Python, Kemudian membangunnya ke penampung dan menerapkan di Cloud Run,

Yang mana server gRPC saya diintegrasikan dengan aplikasi TensorFlow. Sebenarnya tensorflow untuk image ML, tapi ini contoh kode yang bisa kita bahas.

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

Tapi saya selalu mendapat error saat memanggil gRPC suka

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"

Adakah yang saya punya ide? Sebab saat saya uji di localhost semuanya sudah bekerja, bahkan ke container docker masih bisa bekerja, Tapi saat semua yang ada di Cloud Run sudah runtuh.

Tidak yakin apa penyebab utama dari masalah ini. Mungkin keepalive atau timeout?

Saya mencoba banyak hal di saluran koneksi tempat saya mengubah nama host saya

 {HOST}:443

Tolong bantu, terima kasih

Contoh Kode Klien

Saya membuat aplikasi klien sebagai server REST API untuk memanggil gRPC eksternal, server REST API ini juga, menerapkan di 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)

Jawaban

DustinIngram Aug 25 2020 at 11:04

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

Cloud Run (terkelola sepenuhnya) saat ini tidak mendukung streaming HTTP. Oleh karena itu, permintaan masuk dengan protokol seperti WebSockets dan streaming gRPC tidak didukung.