gRPCで配列を返す方法2通り
初心者なので分かりませんでした。
gRPCでデータの配列を返したい場合の実装方法として、レスポンスのデータ型をrepeatedにする方法と、サービスの定義で応答にstreamを使用する方法の2通りがある。
レスポンスのデータ型をrepeatedにする方法。
message Item{
repeated int32 item_id = 1;
}
service MyService {
rpc ListItems() returns (Item) {}
}
サービス定義中で応答にstreamを指定する方法。
message Item{
int32 item_id = 1;
}
service MyService {
rpc ListItems() returns (stream Item) {}
}
どっちを使うか
repeatedを使用すべきシチュエーション
データ量が比較的少量で、容量や応答時間が分かっている場合はこちらを使う。
- 比較的短時間でデータを返すことができる場合
- データの量が決まっている場合
サーバー側であらかじめデータを組み立ててからまとめてクライアントに側に返す。
例えば、eコマースのシステムなどで条件に一致するアイテムの一覧を返すような場合。
streamを使用すべきシチュエーション
その名の通りストリーミングなので、終わりの見えないデータを流し続ける場合に使う。
- データ量が非常に大きくなる可能性がある場合
- データの生成に時間がかかる可能性がある場合
レスポンスに時間がかかる場合、repeatedを使うと応答が終わるまでクライアントの処理はブロックされ続けることになりパフォーマンス的によろしくないし、データが大きすぎる場合はメモリが枯渇する可能性もある。
こういう場合はstreamを使って受け取ったデータを逐次処理していくことでレスポンス性やリソース効率を上げることができる。スケールもしやすいだろう。
あとは、ログメッセージのようなものをチョロチョロ流し続ける時とかもこちらを使うべきだと思う。