优雅关机

解释如何优雅地关闭 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