gRPCの通信方式
from gRPC
table:方式まとめ
client req. message \ server res. message 1 stream
1 Unary Server streaming
stream Client streaming Bidirectional streaming
https://grpc.io/docs/what-is-grpc/introduction/
https://grpc.io/docs/languages/go/basics/
Unary RPC(simple RPC)
最も単純な方式。普通の関数呼び出しのイメージ
クライアントが1つのリクエストを送り、サーバが1つのレスポンスを返す
code:unary.proto
rpc SayHello(HelloRequest) returns (HelloResponse);
Server streaming RPC
アプリの例:server push
返すデータの数が多いときにも使う
クライアントが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);
Client streaming RPC
アプリの例:resumable file upload
クライアントが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での順序は保証
コネクション数の節約目的で使うこともあるらしい
gRPCにおける各RPC方式の実装方法【Simple RPC】 - Carpe Diem(2017/11/13)
code:bidirectional streaming
// request / response の両方の型を stream としている
rpc BidiHello(stream HelloRequest) returns (stream HelloResponse);