コドモン Product Team Blog

株式会社コドモンの開発チームで運営しているブログです。エンジニアやPdMメンバーが、プロダクトや技術やチームについて発信します!

gRPCとProtocol Buffersの違い

これはコドモン Advent Calendar 2022 7日目の記事です。

はじめに

プロダクト開発部の成本です。 今回は自分がgRPCの特徴を調べる際につまずいた箇所について共有します。

⁠想定している読者

ネットワークやバックエンドAPI開発の初学者。 gRPCの概要をつかみたい方。

なぜ書こうと思ったのか

記事の題材を考えていたときのことです。REST APIについて調べ物をしていましたが、RESTに並ぶ別の選択肢として「gRPC」が目に留まりました。しかもバックエンド開発において馴染み深いREST APIの後継とも言われているそうで、ワクワクがとまりません。

早速サンプルを作ってみましたが、その過程で登場する技術が多いうえ、随所でgRPCという単語が登場したため具体的になにを指してgRPCと呼んでいるのか混乱してしまいました。

そこでgRPCについてわかったことから紹介して概要を共有しつつ、自分が疑問を抱えた箇所について記述していきます。

gRPCについてわかったこと

gRPCはRPC(Remote Procedure Call)を使うためのプロトコルである

まず単語の意味について説明します。Remote Procedure Callとはリモートサーバー上に実装された関数を、ローカルクライアントが直接呼び出せるようにするという考え方です。 そしてプロトコルとは「コンピュータとコンピュータがネットワークを利用して通信するために決められた『約束事』」*1 です。

つまり、gRPCはRPCという考え方を実現するためにある、一定の約束事だということです。

gRPCはREST APIよりも高速な通信が可能

理由は主に2つあり、HTTP/2とProtocol Buffersを使う点です。

HTTP/2はTCP/IPのアプリケーション層のプロトコルの一種であり、以下4種類の通信方法が特徴です。

  1. Unary RPC: 1つのクライアントリクエストに対して1レスポンスを返すシンプルな方式で、REST APIでの通信方式と変わりません。
  2. Server Streaming RPC: 1つのクライアントリクエストに対して、サーバーが複数レスポンスを返す方式です。
  3. Client Streaming RPC: Server Streaming RPCの逆です。複数のクライアントリクエストに対してサーバーが1つのレスポンスを返します。
  4. Bidirectional Streaming RPC: Server Streaming RPCとClient Streaming RPCを掛け合わせたものです。複数クライアントリクエストに対して複数サーバーレスポンスを返します。

Protocol Buffersは構造化されたデータのシリアライズ方式の一種です。 シリアライズ方式には他の選択肢としてXMLへの変換や言語特有ライブラリ、そして自前の実装があります。しかし、Protocol Buffersは標準化された規格とシンプルな実装を同時に提供しているため他の選択肢の弱点を補いつつ、利点を掛け合わせることができます。

gRPCとProtocol Buffersの違い

Protocol Buffersはデータのシリアライズ方式の一種とお話ししましたが、その実装は以下の技術の組み合わせで成り立っています。

  1. .proto形式のIDL(Interface Definition Language)を使ったモデルの型定義と、インターフェースの記述
  2. Proto Compilerを使った、各種言語のソースコードの自動生成
  3. 各種言語のランタイムライブラリ

そしてなんと実は、gRPCのサーバー実装は上記の項目を一つずつクリアしていけば一部関数の記述を除きほとんどできるようになっています。

そこで自分が抱えた疑問は、「Protocol BuffersはgRPCとほぼ同義なのか」という点でした。

結論としては別物です。gRPCはRPCを実現するためのプロトコルであり、Protocol BuffersはgRPCが使うデータシリアライズ方式です。 そのため、Protocol BuffersはあくまでgRPCの通信手法に関する技術であり、RPCを支える一部分でしかありません。

まとめ

gRPCは数々の技術によって構成されるため、gRPCという単語が具体的に何をさすのか、制作の過程で分からなくなるかもしれません。 その際にはぜひ「gRPCはRPCという考え方を実装するためのフレームワークであり、その主な構成要素にProtocol Buffersがある」ことを思い出していただけると幸いです。 最後までお読みいただきありがとうございました。


コドモンの開発チームのTwitterを始めました! アドベントカレンダーの新着記事も毎日ツイートしていくので、ぜひフォローしてください😊

twitter.com

*1:マスタリングTCP/IP (井上, 2021, p15)