优雅关机
介绍了如何优雅地关闭 gRPC 服务器,以避免导致已连接客户端的 RPC 调用失败。
优雅关机
介绍了如何优雅地关闭 gRPC 服务器,以避免导致已连接客户端的 RPC 调用失败。
概述
gRPC 服务器通常需要优雅地关闭,以确保正在运行的 RPC 请求能在合理的时间范围内完成,并且不再接收新的 RPC 请求。“优雅关闭函数”(Graceful shutdown function)促进了这一过程,使服务器能够平滑过渡,而无需突然终止活动连接。
当调用“优雅关闭函数”时,服务器会立即通知所有客户端停止发送新的 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++ | |
| Go | Go 示例 |
| Java | Java 示例 |
| Python |
最后修改于 2025 年 1 月 15 日: guides/features: add document for how to gracefully shutdown server (#1388) (cbe3d9a)