📑

gRPC

2021/08/28に公開

仕様の詳細が分かるサイト

ざっくり概要がわかるサイト

protocについて

Tuorialのようなサイト

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、パフォーマンス問題などを任せることができる。

  • REST APIの設計で消耗している感じたときのgRPC入門

感想

  • 定義ファイルがあって、それが設計ドキュメントがわりになりそう。ドキュメントは往々にしてメンテナンスされないので、コードがその役割をになっていると便利

Go

Node

Web

サンプルレポジトリ

https://github.com/easyCZ/grpc-web-hacker-news/tree/master/app

Discussion