gRPC / protobuf

gPRCは protobuf を利用しており、効率的なデータシリアライゼーションを可能にしている。

効率的なデータシリアライゼーションとは?

  • データサイズが小さい:バイナリなので、JSONやXMLより小さいサイズで表現可能。ネットワーク上の転送速度が高速に。
  • パース速度が高速:バイナリ形式なのでJSONとXMLよりパース(データ読み込み・解釈)が高速
  • 言語互換性:多くの言語で利用可能=対応言語間で用意にやり取り可能
  • スキーマによる型安全:データ形式をスキーマで定義することにより、構造と型が明示され、間違ったデータ形式を防ぐ。

Connectとは

弊社CTO記事を拝読するのがよいのだが

https://www.awarefy.dev/blog/better-grpc-connect-go/ https://buf.build/blog/connect-a-better-grpc https://connect.build/docs/introduction/?ref=awarefy.dev#seamless-multi-protocol-support

Connectにすることで、gRPC, Connect, gRPC-Webの3つのプロトコルをサポート1され、gRPC-Webの場合に(Envoyなどの)プロキシが必要だったが、それが不要になる。

Connectプロトコル:HTTP/1.1またはHTTP/2で動作する、gRPCでも動作し、gRPC-Webでも動作します。 gRPC-Webプロトコル:gRPC通信をWebで利用するためのプロトコル。ブラウザでも動作するように制限に合わせたプロトコル定義。

なぜgRPC-WebではEnvoy が必要になるのか?

主要なブラウザはHTTP/2をサポートしている。しているのだがHTTP/2で通信する場合はHTTP/2で通信、そうでない場合は勝手にHTTP/1.1にフォールバックするとのこと。つまりWEBブラウザからの通信にはHTTP/2での通信であることを担保することができない。これにより、HTTP/1.1での通信をプロキシがHTTP/2にトレースすることでgRPCサーバーと通信をすることが可能になり、プロキシが必要な理由である。


flowchart LR

Browser--"HTTP/1.1"-->gRPC-Web
gRPC-Web--"Proxy(e.g. Envoy)"-->
gRPC-Web--"HTTP/2"-->gRPC

gRPC--"HTTP/2"-->gRPC-Web
gRPC-Web--"HTTP/1.1"-->Browser

EnvoyはgRPC-Webのプロキシとして使用されるツールの一つである。 gRPC-WebのリクエストをgRPCリクエスト(HTTP/2)に変換し、gRPCサーバへ転送する。

https://symthy.hatenablog.com/entry/2022/09/24/160309

Connectは前述したとおり、

Connectにすることで、gRPC, Connect, gRPC-Webの3つのプロトコルをサポート1され、gRPC-Webの場合に(Envoyなどの)プロキシが必要だったが、それが不要になる。

ということでプロキシが担っていた役割もConnectが果たしており、プロキシなしでのWebからのgRPC通信が可能になった。


alse see: https://zenn.dev/link/comments/6f9118d0279c18

Footnotes

  1. https://www.awarefy.dev/blog/better-grpc-connect-go/ 2