gRPC とは
- Google が開発している RPC フレームワーク
- Protocol Buffers によるスキーマ定義、シリアライゼーション
- Go, C++, Java, Python, そして Ruby など様々な言語に対応
- protoc がスキーマ定義からコード生成してくれる
- 複数のリクエスト・レスポンス形式
- ストリームによるリクエストまたはレスポンスもできる
- HTTP/2.0 によるトランスポート
- ELB 等でロードバランシングできないので別の方法を考える必要がある
gRPC in Ruby
-
grpc/grpc という monorepo で他の言語とともに開発されている
- grpc-go とかは別リポジトリになっている
- 一部 C による Extension として書かれている
- マルチスレッドサーバー
- Interceptor により Server/Client の両方でフックポイントに実装を挟める
Interceptor
- Rack における Middleware のようなもの
- https://github.com/grpc/grpc/blob/master/src/ruby/lib/grpc/generic/interceptors.rb
- Rack と違って Client 側にも同じような層がある
- Faraday の Middleware みたいなイメージ? (Faraday 使ったことないので適当なこと言ってます)
- 仕様は grpc/proposal というリポジトリに
独断と偏見、gRPC in Ruby における二大問題
- Interceptor がイマイチ
- マルチプロセスじゃないのでスケールしにくい
Interceptor がイマイチ
- レスポンスを取ることができない (nil が返る)
- レスポンスをフィルタしたり、ログしたりができない
- ストリームをラップしたりすることができない
- Go とかはできる
- ストリームの内容をログしたり、メトリクスを残すことができない
- 結果として普通に誰か作ってるだろうという Interceptor が GitHub にも転がっていない
- NewRelic でメトリクスとるやつとか、エラーを Sentry に投げるやつとか
- Rack Middleware とかに比べるとエコシステムがあまりにも残念
マルチプロセスじゃないのでスケールしにくい
- Ruby には GVL があるので
grpc/grpc 以外の実装
cookpad/griffin
- Cookpad 独自実装の gRPC Server
- 僕が思う二大問題を両方解決している!!!
- マルチプロセス x マルチスレッド
- ただし、Interceptor のインターフェイスが微妙に異なるので互換性がない (はず)
- cookpad/griffin-interceptors に欲しい Interceptor がだいたいある
twitchtv/twirp
- gRPC ではなく、Protocol Buffers を使った Twitch 独自の RPC フレームワーク
- 欲しいのは gRPC それ自体ではなく Protocol Buffers なんだ!的な
- Go, Ruby 等の実装がある
- HTTP/1.1 によるトランスポート
- Rack に準拠しているそうなので Middleware とかも使えるっぽい (自分で試すことなく適当なことを言っています)
- ストリームはない
- ストリームはスケーラビリティとかいろいろ難しいから使わない方が良い、という主張 https://github.com/twitchtv/twirp/issues/70#issuecomment-470367807
趣味としての活動
yuya-takeyama/ruby-grpc_prometheus
- 今さっき公開
- grpc-ecosystem/go-grpc-prometheus と同等のことが Ruby でもできるよう目指している
- Prometheus 用のエンドポイントを expose してメトリクスを取ることができる
- Quipper は Datadog を使っているが、Datadog では Prometheus 形式のメトリクスを収集することが可能