2018年3月10日土曜日

gRPC 非同期メソッドのステータスが取得できるタイミング(後編)

C# の gRPC で、メソッド実行ステータスを安全に取得する方法について調べました。前回の DuplexStreaming の場合に続き、今回は ServerStreaming, ClientStreaming, Unary の場合です。




ServerStreaming の場合



ServerStreaming の場合、ResponseStream からのデータ読み取りが完了していればステータスを取得できました。

  1. クライアント:RPC メソッドを呼び出す。戻り値として call オブジェクトを取得できる。
  2. クライアント:call オブジェクトの ResponseStream からのデータ読み取りが終了する。
  3. クライアント:call オブジェクトの GetStatus メソッドでステータスを取得できる。GetTrailers メソッドでトレーラーを取得できる。InvalidOperationException はスローされない。


ClientStreaming の場合


ClientStreaming の場合、CompleteAsync の直後ではステータスを取得できないことがあります。ResponseAsync または ResponseHeadersAsync が完了した後であればステータスを取得できました。

  1. クライアント:RPC メソッドを呼び出す。戻り値として call オブジェクトを取得できる。
  2. クライアント:call オブジェクトの RequestStream の CompleteAsync メソッドを呼び出す。
  3. サーバー:RequestStream からのデータ読み取りが終了する。RPC メソッドの処理を終わらせ、戻り値を返す。
  4. クライアント:call オブジェクトの ResponseAsync が完了する。または ResponseHeadersAsync が完了する。
  5. クライアント:call オブジェクトの GetStatus メソッドでステータスを取得できる。GetTrailers メソッドでトレーラーを取得できる。InvalidOperationException はスローされない。


Unary(非同期呼び出し)の場合


非同期呼び出しの Unary の場合、ResponseAsync または ResponseHeadersAsync が完了した後であればステータスを取得できました。

  1. クライアント:RPC メソッドを呼び出す。戻り値として call オブジェクトを取得できる。
  2. クライアント:call オブジェクトの ResponseAsync が完了する。または ResponseHeadersAsync が完了する。
  3. クライアント:call オブジェクトの GetStatus メソッドでステータスを取得できる。GetTrailers メソッドでトレーラーを取得できる。InvalidOperationException はスローされない。

0 件のコメント:

コメントを投稿

paiza のスキルチェックをやってみました

いまさら感はありますが、 paiza のスキルチェックをやってみました。指定された時間内にコードを書いてユニットテストにかけ、その結果を基に評価を数値化してくれるというものですが、ゲーム感覚で空き時間を見つけて進めていこうと考えています。 どうやら時間が短いほど高い評価を得...