优雅关闭

解释如何优雅地关闭 gRPC 服务器,以避免为已连接的客户端造成 RPC 失败。

优雅关闭

解释如何优雅地关闭 gRPC 服务器,以避免为已连接的客户端造成 RPC 失败。

概述

gRPC 服务器通常需要优雅地关闭,确保正在进行的 RPC 在合理的时间范围内完成,并且不再接受新的 RPC。“优雅关闭函数”有助于此过程,允许服务器平稳过渡,而不会突然终止活动连接。

当调用“优雅关闭函数”时,服务器会立即通知所有客户端停止发送新的 RPC。然后,在客户端收到该通知后,服务器将停止接受新的 RPC。正在进行的 RPC 允许继续,直到完成或达到指定的截止时间。一旦所有活动的 RPC 完成或截止时间到期,服务器将完全关闭。

由于优雅关闭有助于防止客户端遇到 RPC 失败,因此应尽可能使用。但是,gRPC 也提供强制关闭机制,该机制会立即导致服务器停止服务并关闭所有连接,从而导致任何正在进行的 RPC 失败。

如何进行优雅的服务器关闭

“优雅关闭函数”的具体实现因您使用的编程语言而异。但是,一般的模式包括

  • 通过在您的 gRPC 服务器对象上调用“优雅关闭函数”来启动优雅关闭过程。此函数会阻塞,直到所有当前正在运行的 RPC 完成。这确保允许正在进行的请求完成处理。
  • 指定超时时间段以限制允许正在进行的 RPC 完成的时间。使用计时器机制(取决于您的语言)在服务器对象上单独调用“强制关闭函数”至关重要,以便在预定义的时间段后触发强制关闭。这充当安全网,确保服务器最终会关闭,即使某些正在进行的 RPC 未在合理的时间范围内完成。这可以防止无限期阻塞。

以下显示了优雅关闭过程中发生的事件顺序。当服务器的优雅关闭被调用时,正在进行的 RPC 将继续处理,但新的 RPC 将被拒绝。如果某些正在进行的 RPC 未及时完成,服务器将被强制关闭。

sequenceDiagram
Client->>Server: New RPC Request 1
Client->>Server: New RPC Request 2
Server-->>Server: Graceful Shutdown Invoked
Server->>Client: Continues Processing In-Flight RPCs
Client->>Client: Detects server shutdown and finds other servers if available
alt RPCs complete within timeout
    Server->>Client: Completes RPC 1
    Server->>Client: Completes RPC 2
    Server-->>Server: Graceful Shutdown Complete
else Timeout reached
    Server->>Client: Forceful Shutdown Invoked, terminating pending RPCs
    Server-->>Server: Forceful Shutdown Complete
end

以下是基于状态的视图

stateDiagram-v2
    [*] --> SERVING : Server Started
    SERVING --> GRACEFUL_SHUTDOWN : Graceful Shutdown Called (with Timeout)
    GRACEFUL_SHUTDOWN --> TERMINATED : In-Flight RPCs Completed (Before Timeout)
    GRACEFUL_SHUTDOWN --> TIMER_EXPIRED : Timeout Reached
    TIMER_EXPIRED --> TERMINATED : Forceful Shutdown Called

语言支持

语言示例
C++
GoGo 示例
JavaJava 示例
Python