1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

gRPCにおけるrepeatedとstreamの使い分け

Posted at

gRPCで配列を返す方法2通り

初心者なので分かりませんでした。

gRPCでデータの配列を返したい場合の実装方法として、レスポンスのデータ型をrepeatedにする方法と、サービスの定義で応答にstreamを使用する方法の2通りがある。

レスポンスのデータ型をrepeatedにする方法。

message.proto
message Item{
  repeated int32 item_id = 1;
}
service MyService {
  rpc ListItems() returns (Item) {}
}

サービス定義中で応答にstreamを指定する方法。

message.proto
message Item{
  int32 item_id = 1;
}
service MyService {
  rpc ListItems() returns (stream Item) {}
}

どっちを使うか

repeatedを使用すべきシチュエーション

データ量が比較的少量で、容量や応答時間が分かっている場合はこちらを使う。

  • 比較的短時間でデータを返すことができる場合
  • データの量が決まっている場合

サーバー側であらかじめデータを組み立ててからまとめてクライアントに側に返す。
例えば、eコマースのシステムなどで条件に一致するアイテムの一覧を返すような場合。

streamを使用すべきシチュエーション

その名の通りストリーミングなので、終わりの見えないデータを流し続ける場合に使う。

  • データ量が非常に大きくなる可能性がある場合
  • データの生成に時間がかかる可能性がある場合

レスポンスに時間がかかる場合、repeatedを使うと応答が終わるまでクライアントの処理はブロックされ続けることになりパフォーマンス的によろしくないし、データが大きすぎる場合はメモリが枯渇する可能性もある。
こういう場合はstreamを使って受け取ったデータを逐次処理していくことでレスポンス性やリソース効率を上げることができる。スケールもしやすいだろう。

あとは、ログメッセージのようなものをチョロチョロ流し続ける時とかもこちらを使うべきだと思う。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?