gRPCの通信方式
table:方式まとめ
client req. message \ server res. message 1 stream
1 Unary Server streaming
stream Client streaming Bidirectional streaming
最も単純な方式。普通の関数呼び出しのイメージ
クライアントが1つのリクエストを送り、サーバが1つのレスポンスを返す
code:unary.proto
rpc SayHello(HelloRequest) returns (HelloResponse);
返すデータの数が多いときにも使う
クライアントが1つのリクエストを送り、サーバは一連のmessage(sequence of messages)を読み込むためのstreamを返す
クライアントはmessageがなくなるまでストリームからreadしつづける
gRPCはRPC call中でのmessageの順序保証をする
code:server streaming RPC
// response type が stream になっている点に注目
rpc LotsOfReplies(HelloRequest) returns (stream HelloResponse);
クライアントがstream経由で一連のmessageを書き込んで、サーバに送る
クライアントはmessageの書き込みがおわったら、サーバがそのデータを全部読み込んでからレスポンスを返すまで待つ
gRPCがmessageの順序保証をする
code:client streaming RPC
// request type が stream になっている点に注目
rpc LotsOfGreetings(stream HelloRequest) returns (HelloResponse);
Bidirectional streaming RPC
アプリの例:チャット
「〜しているあいだデータを送受信し続けたい」ときに使う
read-write streamをつかって、client/serverのどちらもが一連のmessageを送る
read/write streamの操作は独立しているので、どちらも好きな順序で読み書きできる
例:サーバが、
クライアントからのmessageのすべてを受け取るまでレスポンスをしない
「クライアントのmessageを1つ読み込んでからmessageを1つ書き込む」を繰り返す
その他、読み込みと書き込みを組み合わせる
みたいなことをできる
各streamでの順序は保証
コネクション数の節約目的で使うこともあるらしい
code:bidirectional streaming
// request / response の両方の型を stream としている
rpc BidiHello(stream HelloRequest) returns (stream HelloResponse);