LoginSignup
110
79

More than 5 years have passed since last update.

gRPCにおけるRPC方式の整理

Last updated at Posted at 2015-09-17

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) {}
}

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

110
79
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
110
79