安全なシャットダウン
接続中のクライアントにRPCエラーを引き起こすことなく、gRPCサーバーを正常にシャットダウンする方法を説明します。
安全なシャットダウン
概要
gRPCサーバーでは、実行中のRPCが合理的な時間枠内に完了することを保証し、新規RPCの受付を停止することで、正常なシャットダウンが必要になることがよくあります。「正常終了機能」は、このプロセスを容易にし、アクティブな接続を突然終了することなく、サーバーがスムーズに移行できるようにします。
「正常終了機能」が呼び出されると、サーバーはすべてのクライアントに新しいRPCの送信を停止するように即座に通知します。クライアントがその通知を受け取った後、サーバーは新しいRPCの受付を停止します。実行中のRPCは、完了するか、指定されたデッドラインに達するまで続行されます。すべてのアクティブなRPCが完了するか、デッドラインが期限切れになると、サーバーは完全にシャットダウンします。
正常終了はクライアントがRPCエラーに遭遇するのを防ぐのに役立つため、可能な限り使用すべきです。しかし、gRPCには強制シャットダウンメカニズムも用意されており、これによりサーバーは即座にサービスを停止し、すべての接続を閉じます。これにより、実行中のRPCはすべて失敗します。
gRPCサーバーの正常終了方法
「正常終了機能」の具体的な実装は、使用しているプログラミング言語によって異なります。ただし、一般的なパターンは以下の通りです。
- 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 |