来自Python服务器的gRPC一元流 - > C#客户端:“流已删除”

时间:2018-01-26 06:44:06

标签: python grpc

我有一个从Python服务器(1.8.4)到C#客户端(1.8.3)的一元流服务。

当我发信号通知Python关闭(TERM15)时,调用下面代码清单中的shutdown方法,其目的是正常终止RPC,并关闭服务器。

当我在localhost上运行服务器时,这会起作用,会引发一个具有预期状态的RpcException:Status(StatusCode=Cancelled, Detail="Completed")

但是,当在Kubernetes(GKE)中运行服务器并终止我在客户端中收到:Grpc.Core.RpcException: Status(StatusCode=Unknown, Detail="Stream removed")的pod时。 python服务器位于haproxy入口控制器和google-cloud-endpoint代理之后,但据我所知,这些组件都不会影响连接。

有人能想到可能导致客户端RpcException中的不同状态的原因吗?

class StreamsService(StreamsServicer):
    def MyHandler(self, request, context):
        while not stop_event.isSet():
            try:
                yield update_q.get(True, 0.1)
            except queue.Empty:
                continue

        context.set_code(grpc.StatusCode.CANCELLED)
        context.set_details("Completed")

def shutdown(subscriber_service: StreamsService,
             executor: futures.ThreadPoolExecutor,
             server: grpc.Server, exit_code):    

    logger.info("Stopping stream handlers")
    for stop_event in subscriber_service.stop_events:
        stop_event.set()

    logger.info("Stopping executor")
    executor.shutdown()

    logger.info("Stopping server")
    ev: threading.Event = server.stop(grace=10)  # allows RPCs to terminate gracefully

    logger.info("Waiting for server to stop gracefully")
    ev.wait()

    logger.info("Stopping process with exit code {}".format(exit_code))
    sys.exit(exit_code)

(ps。从https://groups.google.com/forum/#!topic/grpc-io/Ge6hcUUhXzo交叉发布)

1 个答案:

答案 0 :(得分:1)

原来这个 是一个问题,google-cloud-endpoint / NGINX容器在同一个pod中的gRPC服务器容器有机会正常关闭它之前被终止。

如果有人对了解更多信息感兴趣,那么我在这里与我进行了一次对话:https://groups.google.com/forum/#!topic/google-cloud-endpoints/FyfdvD6xS1Q