Edited at

gRPCにおけるRPC方式の整理

More than 3 years have passed since last update.

gRPCは通信方法にHTTP/2を使用することにより、一般的なRPCにおける1Request-1Responseな方式の他、1つのTCPコネクションの中で複数のRequest/Responseをやり取りすることが可能となっている。

このTIPSでは、gRPCで使用できるRPCの方式と、protoファイルへの定義方法について記載する。protocolbuffers自体の定義方法は、ここでは省略する。


1.Simple-RPC

Simple-RPC方式は、一般的なRPCと同様の1Request-1Responseな方式。

HTTP/2の恩恵はあまり受けられないが、最もシンプルで制御し易い方法と言える。

simple.png

定義方法


Sample.proto

syntax = "proto3"

service MyService {
rpc simpleRPC(MyRequest) returns (MyResponse){}
}


2.ServerSideStreaming-RPC

クライアントから1つのリクエストを投げた後、サーバーから1〜任意数のレスポンスを受け取ることができる方式。レスポンスの内容を「まとめて」ではなくても良いから少しでも早く欲しい場合に有用。

serversidestream.png

定義方法


Sample.proto

syntax = "proto3"

service MyService {
rpc serverSideStreamingRPC(MyRequest) returns (stream MyResponse) {}
}

メッセージの前にstreamが付いていることに注意。


3.ClientSideStreaming-RPC

クライアントから1〜任意数のリクエストを投げた後、サーバーから1つのレスポンスを受け取る方式。クライアントからのリクエストが送付され終わるのを待たず、少しでも早くサーバー側でのリクエスト処理を開始したい場合に有用。

clientsidestream.png

定義方法


Sample.proto

syntax = "proto3"

service MyService {
rpc clientSideStreamingRPC(stream MyRequest) returns (MyResponse) {}
}


4.BidirectionalStreaming-RPC

1つのTPCコネクションの中で、RequestとResponseの送受信を任意数繰り返す方式。HTTP/2の恩恵を最も受けることができる反面、実装は複雑になる。

bidirectionalstream.png

定義方法


Sample.proto

syntax = "proto3"

service MyService {
rpc bidirectionalStreamingRPC (stream MyRequest) returns (stream MyResponse) {}
}

今回は以上です。お疲れ様でした。