优雅关机

解释了如何优雅地关闭 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
最后修改于 2025 年 1 月 15 日: guides/features: 添加如何优雅关机服务器的文档 (#1388) (cbe3d9a)