安全なシャットダウン

接続中のクライアントにRPCエラーを引き起こすことなく、gRPCサーバーを正常にシャットダウンする方法を説明します。

安全なシャットダウン

接続中のクライアントに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++
GoGo 例
JavaJava 例
Python