gRPC call, channel, connection and HTTP/2 lifecycle

前端 未结 2 2060

I read the gRPC Core concepts, architecture and lifecycle, but it doesn\'t go into the depth I like to see. There is the RPC call, gRPC channel, gRPC connection (not described i

2条回答
  •  名媛妹妹
    2021-02-10 09:48

    The connection is not a gRPC concept. It is not part of the normal API and is an implementation detail. This should be seen as fairly normal, like HTTP libraries providing details about HTTP exchanges but not exposing connections.

    It is best to view RPCs and connections as two mostly-separate systems.

    The only real guarantee is that "connections are managed by channels," for varying definitions of "managed." You must shut down channels when no longer used if you want connections and other resources to be freed. Other details are either an implementation detail or an advanced API detail.

    There is no "gRPC connection." A "gRPC connection" would just be a standard "HTTP/2 connection." Except that is even an implementation detail of the transport in many gRPC implementations. That allows having alternative "connection" types like "inprocess" or QUIC (via Cronet, where there is not a classic "connection" at all).

    It is the channel's job to hold all the connections and reconnect as necessary. It delegates part of that responsibility to load balancers and the load balancing APIs do have a concept of connections (subchannels). By not exposing connections to the application, load balancers have a lot of freedom to operate.

    I'll note that gRPC C-core based implementations share connections across channels.

    What happens to the channel when a RPC throws an exception?

    The channel and connection is not impacted by a failed RPC. Note that connection-level failures typically cause RPCs to fail. But things like retries could allow the RPC to be re-sent on a new connection.

    What happens to the gRPC connection when the channel is closed?

    The connections are closed, eventually. Channel shutdown isn't instantaneous because existing RPCs can continue, and connection shutdown isn't instantaneous as well. But once all RPCs complete the connections are closed. Although C-core won't shut down a connection until no channels are using it.

    When is the channel closed?

    Only when the user closes it.

    When is the gRPC connection closed?

    Lots of times. The client may close it when no longer needed. For example, let's say the server IP address changes and the client need to connect to 1.1.1.2 instead of 1.1.1.1. A new connection will be created and new RPCs will go to the new IP address. The client may also close connections it thinks are dead (e.g., via keepalive timeouts).

    Servers have a lot of say of when to close connections. They may close them simply because they are old, or because they have been idle, or because the server is overloaded. But those are simply use-cases; the server can shut down a connection at-will.

    What if the deadline is exceeded?

    Deadline only applies to RPCs and doesn't impact the channel or a connection.

提交回复
热议问题