はじめに
今回はAPI Meetupの新しい企画でTech Deep Diveに参加しました。Tech回は個人的にとても好きで、いつも勉強になります。今回は、gRPCというプロトコルバッファの紹介と運用のお話でした。
What I learned about APIs in my first year at Google (Protocol Buffers and gRPC)
Tim Burks, Staff Software Engineer, Google Inc. 元々iOSのエンジニアだったが、APIに興味がありすぎてGoogleに入ってからAPIのことを始めた。 APIの仕事をはじめたときに思ってたこと
- APIは必要だ
- APIはちゃんと動くかテストしないといけない
- APIはアプリケーションごとに最適な設計をしないといけない
GoogleはBig companyなので、、、
- 自分の言語で実装する
- 自分で最適化する
- 自分で標準化する
- 柔軟に、変化に対応できるようにする
protocol buffersが発明された
- serialization mechanism
- interface description language
- methodology
Googleでは内部のAPIはすべてProtocol Buffersで通信している。gRPCはOSS。NetflixもgRPCを使い始めた。 gRPCはOpenAPIのサポートをはじめたところ。 ※つまり、WebAPIをgRPCで提供する時代がくる? ※Timさんにあとで話を聞いたところ、「2年位でサーバーサイドはgRPCのようなプロトコルバッファが主流の時代になる。フロント側はJSON(REST)。5年から10年もすればフロント部分もプロトコルバッファになる・・・かもしれない。」ということでした。今から時代を先取っておけば2年後にフリーランスで荒稼ぎできるかもしれません。
gRPC and REST with gRPC in practice (19:55〜20:25)
Masahiro Sano (@kazegusuri), Principal Engineer, Mercari Inc 特徴(さっきの講演からかぶってないところだけ)
- コネクションをはりっぱなしにできるところが特徴。
- RPCをクライアント側、サーバー側で突然終了しても許容。デッドラインとタイムアウトを設定できる。
- 独自のステータスコードがある。
- メッセージフォーマットは選べる。プロトコルバッファーに限らない。
gRPCの使い方 サーバー側
- proto定義を書く
- protoからGoコードを生成する(Goじゃなくてもよい)
- サービスを実装する
- gRPCサーバーを起動する
クライアント側
- protoからRubyコードを生成する(Rubyじゃなくてもよい)
- クライアント側を実装
RESTは必要か? →必要なシーンはある でもRESTに戻りたくない 大丈夫。grpc-gatewayがある。 →RESTからgRPCへ変換する proto定義からswagger specを生成できる。 gRPC-Web
- grpcweb: gRPCサーバーをgRPC-Web protocolでラップ
- ts-protoc-gen: ブラウザ向けのgRPC-Webクライアント
- ...(書き漏らした)
課題
- Interceptor
- エラー時の詳細情報が仕様上の問題で返せない。どうしよう?全部OKにしてエラー用のメッセージを送るようにするのが現状解?
- ロードバランスしづらい。一度つながっちゃうと固定。リクエスト単位でロードバランスするしかない。
メルカリではgRPCを一部に採用。 クライアントアプリに採用しようとして、、、断念。クライアントの更新はハンドリングが難しい。強制アップデートできるならやりやすいかも。 gRPCが使えない状況は多い。クラウドでは使えないことが多い。 ただし、http2にのってるから、周辺ツールは誰かがどんどん作ってくれる。
おわりに
gRPCの概要が分かる良い勉強会でした。Apitoreですぐに採用するわけにはいかないですが、キャッチアップだけはしておきます。 関係ない話ですが、Timさんは日本人に配慮してくれたのか、とてもゆっくり話してくれるジェントルマンでした。聞き取りやすかったです。直接お話したときも紳士な対応をしてくれました。GCPユーザーという話をしたら、GoogleのOfficialグッズをくれました。GCPロゴ入り枕です。この大雑把な感じがアメリカっぽくて良いですね! 最後に、会場にApitoreを知ってくれている方が居ました!Qiitaに投稿した技術ブログを読んでくれたそうです。ありがたいです。より一層がんばろうと思います☺