gRPC
仕様の詳細が分かるサイト
ざっくり概要がわかるサイト
protocについて
Tuorialのようなサイト
- OK Google, Protocol Buffers から生成したコードを使って Node.js で gRPC 通信して
- goでgRPCの4つの通信方式やってみた(Dockerのサンプルあり)
- Generate a fully-working Go gRPC server in two minutes with Ent
gRPCとは
そもそもRPCとは以下
RPCはいわゆる「クライアント−サーバー」型の通信プロトコルであり、サーバー上で実装されている関数(Procedure、プロシージャ)をクライアントからの呼び出しに応じて実行する技術だ。クライアントはサーバーに対し実行する処理を指定するパラメータや引数として与えるデータを送信し、それに対しサーバーはパラメータに応じた処理を実行してその結果をクライアントに返す、というのがRPCの基本的な流れだ。
RPCは古くからある考え方であり、インターネットが普及する以前より存在していた。一方で、どのようにクライアントからリクエストを送信するかや、どのようなフォーマットでデータをやり取りするかについては時代に応じて変化しており、さまざまな実装が存在する。近年のWebベースのシステムにおいてはHTTP/HTTPSベースでサーバー・クライアント間のやり取りを行い、またその際のデータフォーマートにはXMLを利用する「XML-RPC」や、同じくHTTP/HTTPSベースでデータフォーマットにJSONを利用する「JSON-RPC」といったものが多く使われている。
XML-RPCやJSON-RPCは、広く普及しているHTTP/HTTPSやXML、JSONといった技術を利用するため導入しやすいという利点がある。一方で、これらは基本的にテキストベースで情報をやり取りするためデータの転送効率が悪く、またバイナリデータを扱いにくいという問題があった。また、HTTP/HTTPSを使用しているため比較的長い期間で散発的にデータをやり取りしにくかったり、転送効率の面でもオーバーヘッドが存在したりする。こういった問題を解決するために考案されたのが、今回紹介するgRPCだ(図1)。
このあたりは、MySQLにもストアドプロシージャという機構があったりして、なんとなく馴染みがある。
gRPC解決すること(上のURLより抜粋)
-
Rest APIだと、複雑化していき、設計や管理、その仕組み作りに時間を取られる。gRPCでは、サーバ、クライアント用ソースコードの自動生成可能。
-
IDLにより異なる言語間でも型保証された通信が可能
-
多言語対応(C++, Java, Go, Python, Ruby, Node.js, Android Java, C#, Objective-C, PHP等)
-
JSONや他のシリアライズフォーマットと比べ、通信量が少なく、高速(実際には環境や実装言語によって大分違いがあるようなので、検討する場合には一度検証が必要)
-
シリアライズの互換性を維持した拡張が可能
-
REST APIが欲しくなったら、
grpc-gateway
で通常通りgRPCで構築したサーバにREST経由でのアクセスも可能。 -
gRPCではこういった仕様が固まっている部分が多く、各言語のサーバ、クライアント生成、必要となればREST APIやSwagger UI、パフォーマンス問題などを任せることができる。
感想
- 定義ファイルがあって、それが設計ドキュメントがわりになりそう。ドキュメントは往々にしてメンテナンスされないので、コードがその役割をになっていると便利
Go
Node
- TypeScriptでgRPCしたいがいろいろあってよくわからない
- https://lightbulbcat.hatenablog.com/entry/2018/09/20/023917
- https://zenn.dev/ryo_kawamata/articles/ts-from-protocol-buffers
- https://knowledge.sakura.ad.jp/24059/
- TypeScriptにおけるgRPC関連ライブラリの比較とプロダクト開発で採用した方法の紹介
Web
サンプルレポジトリ
Discussion