2020/02/03

よくわかるgRPCを読んだまとめ


同人誌よくわかるgRPCを読んでみたのでそのまとめ 業務でもgRPCを利用しているけど業務をやりつつ学んでいくスタイルだったので、一度最初に立ち返りおさらいしようという意図で読んでみた

第1章 そもそもgRPCとは?

Googleが開発したRPCフレームワーク 実際はネットワークを通して呼び出すんだけど、実装的には普通に関数を呼び出しているような感じ

以下ざっくりとした特徴

  • Protocol Buffersを利用したIF(RPC)の定義
  • 定義したprotoからクライアント・サーバ用のコードを自動生成してくれる(しかも色んな言語に対応)
  • HTTP/2の仕組みを利用している

第2章 gRPCの仕組み

RPCの種類とChannel

gRPCには4つの種類がある

  • Unary RPC (Client:1 -> Server:1) // シンプルなリクエスト・レスポンス
  • Server streaming RPC(Client:1 -> Server:N)
  • Client streaming RPC(Client:N -> Server:1)
  • Bidirectional streaming RPC(Client:N -> Server:N)// チャットとかに向いてる

gRPCの大事な技術としてChannelがあり、通信経路みたいなもの Channelでは以下のようなことをやっている

  • 名前解決
  • 再接続制御
  • 認証制御 など

Channelには状態遷移がある

  • Connecting
  • Ready
  • Idle
  • Shutdown
  • Transient Failure

基本的にはConnecting -> Ready -> Shutdownと進むが、通信がアイドルになるとIdleになったり、タイムアウトしたり接続失敗したときにTransient Failureに状態遷移する ただし、たいていはConnectingにまた状態遷移しリトライする

HTTP/2のConnection, Stream, Frame

  • Connection
  • TCP接続の単位
  • Stream
  • Connection上にある通信の単位
  • gRPCでいうと一つのRPCに対応しているため、RPCが呼び出されるごとにStreamが作られる
  • Frame
  • Stream内の情報の単位
    connection-stream-frame-diagram.jpg

今まで(HTTP/1.1)は一つのConnectionで一つのリクエスト・レスポンスしか通信できなかったが、HTTP/2では一つのConnectionで複数のStreamをやりとりできるようになったおかげで効率的な通信が可能になった

そして先程出てきたgRPCのChannelはHTTP/2のConnectionとStreamをいい感じに管理してくれる

第3章 gRPCの応用

InterceptorというRPC処理の前後に処理を挟むことができる機能がある middlewareみたいなもの ロギング、認証、メトリクス収集などの共通処理をするのに便利

ロードバランシング

gRPCではクライアントごとではなく、RPC呼び出しごとにロードバランシングする

ロードバランシングにも以下2つ方法がある

  • クライアント側でやるロードバランシング
  • 外部LBを使ったロードバランシング

ただクライアント側でやるロードバランシングはクライアントごとに実装をする必要があって大変 外部LBを使ったロードバランシングでも方式に注意する必要がある

接続ベース(L4)でのロードバランシング

新しい接続が確立されるたびに負荷分散させる方式 下の方のレイヤ(L4)で通信するため、比較的高速に通信が可能 ただしHTTP/2は一つの接続(HTTP/2 Connection)を使い続ける場合があるため、うまく分散されずに偏る場合がある

RPCベース(L7)でのロードバランシング

RPC呼び出しごとに負荷分散させる方式 そのためにLBがRPC(HTTP/2 Stream)を認識して分散させるため、接続ベースよりも高機能なLBとなる

L7でのLB機能を持つソフトウェアとして代表的なものにEnvoy ProxyやLinkerdなどがある 特にKubernetesを意識して作られているのが特徴

便利なツール

grpcurl

gRPC版curl

$ brew install grpcurlBloomRPC

GUIのgRPC呼び出しツール POSTMANのgRPC版のような感じ 普段の開発のデバッグにはこっちのほうが便利かも?

まとめ

この記事では省略したが、第2章では他にも以下のことを紹介していた 気になる人は本を買って読んでみると良さそう(価格も1000円と安いしPDFもある)

  • Wiresharkを使って通信の中身を見てみる
  • gRPCのエラーコード
  • エラーコードと更に詳細なエラー内容の返し方
  • 通信のキャンセルのやり方
  • TLSを使ったgRPCのやり方

以下感想まとめ

  • 個人的にHTTP/2とgRPCの関係性がわかったので非常に満足した一冊だった
  • 第3章までしかなくページ数が70ページちょっとと短いので2時間くらいで読み終えることができた
  • サンプルコードがgolangで書かれてて、仕事でも使用しているので理解がしやすかった
  • gRPC入門にはちょうど良い質と量
  • gRPCとHTTP/2の結びつきがわかる
  • gRPCマスコットがパンケーキくんというのも初めて知った(というかマスコットキャラいたんだ…)