gRPC のメソッドを実行している最中にアプリケーションを終了させたらどうなるのかを調べてみました。
検証アプリケーション
サーバーAP:.NET Core コンソールアプリケーション
クライアントAP:Windows フォームアプリケーション
Unary, UnaryAsync, ServerStreaming, ClientStreaming, DuplexStreaming 方式の各メソッドを実行するボタンを配置しただけのシンプルなアプリケーションです。
結果
- 実行中にクライアントAPを終了させるとサーバーAPで InvalidOperationException が発生するものの、gRPC 内部でハンドリングされます。
- ClientStreaming, DuplexStreaming メソッドの場合、クライアントAPから RequestStream を正しく完了(CompleteAsync)させてから終了させればサーバーAPで InvalidOperationException は発生しません。
- 実行中にサーバーAPを終了させるとクライアントAPで例外が発生します。RpcException のステータスコードは Unknown になります。
- gRPC サーバーのシャットダウンは実行中のメソッドの処理が終了するまで待機状態になります。シャットダウン待機中にサーバーAPを終了させるとクライアントAPで例外が発生します。RpcException のステータスコードは Internal になります。
- シャットダウン処理中も実行中のメソッドの処理は継続されます。RequestStream への書き込み、ResponseStream からの読み取りを行うことができます。
- Unary, ServerStreaming メソッドの場合、実行中のメソッドの処理が完了した後にシャットダウンが完了します。
- ClientStreaming, DuplexStreaming メソッドの場合、RequestStream が完了し、サーバー側の処理が完了した後にシャットダウンが完了します。
Unary
クライアントAPからメソッドを実行してから、
1 |
サーバーAPを終了させる |
クライアントAPで例外が発生します。StatusCode=Unknown, Detail="Stream removed" |
2 |
gRPC サーバーをシャットダウンする |
シャットダウンが完了せず待機状態になります。メソッドの処理は継続され、クライアントAPにレスポンスが返されます。処理が終了した時点でシャットダウンが完了します。 |
3 |
2 の状態でサーバーAPを終了させる |
クライアントAPで例外が発生します。StatusCode=Internal, Detail="GOAWAY received" |
5 |
4 の後、クライアントAPを再び起動してメソッドを実行する |
正常に処理されます。 |
4 |
クライアントAPを終了させる |
サーバー側の処理が終わるまでクライアントAPはブロックされます。サーバー側の処理が終了した時点でクライアントAPが終了します。 |
UnaryAsync
クライアントAPからメソッドを実行してから、
1 |
サーバーAPを終了させる |
クライアントAPで例外が発生します。StatusCode=Unknown, Detail="Stream removed" |
2 |
gRPC サーバーをシャットダウンする |
シャットダウンが完了せず待機状態になります。メソッドの処理は継続され、クライアントAPにレスポンスが返されます。処理が終了した時点でシャットダウンが完了します。 |
3 |
2 の状態でサーバーAPを終了させる |
クライアントAPで例外が発生します。StatusCode=Internal, Detail="GOAWAY received" |
4 |
クライアントAPを終了させる |
クライアントAPはすぐに終了します。サーバーAPで InvalidOperationException がスローされますが、gRPC 内部でハンドリングされ、警告ログが出力されます。 |
5 |
4 の後、クライアントAPを再び起動してメソッドを実行する |
正常に処理されます。 |
ServerStreaming
クライアントAPからメソッドを実行して AsyncServerStreamingCall を受け取ってから、
1 |
サーバーAPを終了させる |
クライアントAPで例外が発生します。StatusCode=Unknown, Detail="Stream removed" |
2 |
gRPC サーバーをシャットダウンする |
シャットダウンが完了せず待機状態になります。メソッドの処理は継続され、クライアントAPにレスポンスが返されます。処理が終了した時点でシャットダウンが完了します。 |
3 |
2 の状態でサーバーAPを終了させる |
クライアントAPで例外が発生します。StatusCode=Internal, Detail="GOAWAY received" |
4 |
クライアントAPを終了させる |
クライアントAPはすぐに終了します。サーバーAPで InvalidOperationException がスローされますが、gRPC 内部でハンドリングされ、警告ログが出力されます。 |
5 |
4 の後、クライアントAPを再び起動してメソッドを実行する |
正常に処理されます。 |
ClientStreaming
クライアントAPからメソッドを実行して AsyncClientStreamingCall を受け取ってから、
1 |
サーバーAPを終了させる |
クライアントAPで例外が発生します。StatusCode=Unknown, Detail="Stream removed" |
2 |
gRPC サーバーをシャットダウンする |
シャットダウンが完了せず待機状態になります。 |
3 |
2 の状態でサーバーAPを終了させる |
クライアントAPで例外が発生します。StatusCode=Internal, Detail="GOAWAY received" |
4 |
2 の状態でクライアントAPからリクエストを送信する |
サーバーAPにリクエストが届き、メソッドを処理できる状態であれば処理が行われ、クライアントAPにレスポンスが返されます。 |
5 |
2 の状態でクライアントAPから完了を通知する(CompleteAsync) |
gRPC サーバーのシャットダウンが完了します。 |
6 |
クライアントAPを終了させる |
クライアントAPはすぐに終了します。サーバーAPで InvalidOperationException がスローされますが、gRPC 内部でハンドリングされ、警告ログが出力されます。 |
7 |
6 の後、クライアントAPを再び起動してメソッドを実行する |
正常に処理されます。 |
DuplexStreaming
クライアントAPからメソッドを実行して AsyncDuplexStreamingCall を受け取ってから、
1 |
サーバーAPを終了させる |
クライアントAPで例外が発生します。StatusCode=Unknown, Detail="Stream removed" |
2 |
gRPC サーバーをシャットダウンする |
シャットダウンが完了せず待機状態になります。処理は継続され、クライアントAPにレスポンスが返されます。 |
3 |
2 の状態でサーバーAPを終了させる |
クライアントAPで例外が発生します。StatusCode=Internal, Detail="GOAWAY received" |
4 |
2 の状態でクライアントAPからリクエストを送信する |
サーバーAPにリクエストが届き、処理が実行できる状態であれば処理が行われ、クライアントAPにレスポンスが返されます。 |
5 |
2 の状態でクライアントAPから完了を通知する(CompleteAsync) |
gRPC サーバーのシャットダウンが完了します。 |
6 |
クライアントAPを終了させる |
クライアントAPはすぐに終了します。サーバーAPで InvalidOperationException がスローされますが、gRPC 内部でハンドリングされ、警告ログが出力されます。 |
7 |
6 の後、クライアントAPを再び起動してメソッドを実行する |
正常に処理されます。 |
0 件のコメント:
コメントを投稿