概要
gRPCを理解する必要が出てきたので、まず gRPC とは何かをざっと調べた備忘です。
RPC
gRPCのベースになっている RPC(Remote Procedure Call) について簡単に記載します。 以下のコードは1つのプログラム内で関数呼び出しが行われ、 main関数から引数を渡す形でhello関数を呼び出し, hello関数の処理を実行後に戻り値を受け取って, 標準出力に出力しているプログラムになります。
package main import "fmt" func main() { hello("hello") } func hello(x string) { fmt.Println(x, "world!!") }
イメージは以下のような感じになるかと思います。
RPCはこれをネットワーク越しに行うことを想定したものになります。 RPC では, クライアントとサーバー間の通信はネットワークを介して行われることになりますが, クライアントからの API リクエストとサーバーのやりとりはローカル操作・内部サーバー内のコードであるかのように動作するようです。 リクエストには, 呼び出す先のサーバー側に定義されている関数やパラメータが含まれています。
gRPC
gRPC は, HTTP/2 上に実装された最新の RPC プロトコルで、元は Googleによって RPC基盤であるStubbyの次世代版として2015年に開発されたRPCの実装とのことです。 現在はOSSになっています。
ちなみに gRPC の g は Google を指しているのかと思いましたが、バージョンによって意味が違うようです。
ちなみに gRPC の g は Google を指しているのかと思いましたが、バージョンによって意味が違うようです。
gRPC を使う理由
ドキュメントには以下のような記載があります。
- Binary protocol (HTTP/2)
- Multiplexing many requests on one connection (HTTP/2)
- Header compression (HTTP/2)
- Strongly typed service and message definition (Protobuf)
- Idiomatic client/server library implementations in many languages
In addition, gRPC integrates seamlessly with ecosystem components like service discovery, name resolver, load balancer, tracing and monitoring, among others.
HTTP/2 の機能であるバイナリプロトコル, 1 つの接続で多数のリクエストを多重化, ヘッダー圧縮などの機能や, プロトコルバッファの厳密に型指定されたサービスとメッセージ定義など,主に通信面での利点を得たい場合には採用を検討することになりそうです。
あとは色々な言語でのクライアント/サーバー ライブラリ実装もあるようです。また、サービス検出、名前解決、ロード バランサ、トレース、監視などのエコシステム コンポーネントとシームレスに統合できるとされています。
gRPC ロードバランシング(負荷分散)
ドキュメントに記載がありました。
クライアントサイド型負荷分散とプロキシ型(サーバーサイド型)負荷分散の方式があるようです。 プロキシ型の場合は、L7とL3/L4レベルのロードバランシングに分けられるようです。 クラアントサイド型の場合はサービスディスカバリなどの外部の仕組みと統合しバランシングを管理するThick clientと呼ばれている方式と、負荷分散の機能を別な LB サーバーとして切り出す(Envoyをサイドカーコンテナとして動かすなど)Lookasideと呼ばれている方式があるようです。