gRPC-Web over HTTP/3

gRPC-WebはgRPCサービスをブラウザから利用するためのプロキシプロトコルで、ブラウザが対応する素朴なhttpリクエストをベースに構築されています。

ネイティブgRPCはHTTP/2を前提としており、 HTTP/3については議論中です。

gRPC-WebのHTTP/3対応は自明ではありません。ブラウザ対応の目的から、もとよりHTTP/2に限らずHTTP/1.1上でも動作しています。
gRPC-Webはプロトコルにアップデートがなく、規格策定が先行する様子もありません。

どうやらgRPC-WebはHTTP/3上で動作する

現実には、フロントエンドプロキシがHTTP/3を提供する場合、gRPC-WebでもHTTP/3上で動作する挙動になります。
たとえば GoogleのロードバランサのうちアプリケーションロードバランサはHTTP/3を提供しており、その背後でgRPC-Webサービスを提供するとHTTP/3で接続しています。

個別の接続でHTTPのどのバージョンを採用するかはブラウザしだいです。gRPC-WebのクライアントライブラリはfetchAPIを用いて実装しているケースが多いと推測しますが、Chromeの場合fetch()にも積極的にHTTP/3を利用するようです。

HTTP/3はQuic/UDPで接続するため、WANプロトコルとしては性能向上を期待できます。ただしこのブラウザ挙動は、gRPC-Webの個別サービスがHTTPバージョンを制御する手段がないということでもあります。

運用中のproductionクラスタは意図せずgRPC-Web orver HTTP/3構成になってしまいましたが、サーバサイド・ストリーミングを含めて不具合はまったく起きていません。
実構成を再現するテストスイートも長期の実績があり、結果的に安定動作していると言える状況です。

gRPC-Web over HTTP/3の構成

GCPロードバランサの機能により自動的にgRPC-WebがHTTP/3に対応しているので、必要な構成は検証していません。しかし、ロードバランサはプロトコル変換とわずかなHTTPヘッダーの操作にとどまります。

gRPC-Webのプロキシにはenvoyを採用することが多いでしょう。構成済みのUpstream設定にくわえて、HTTP/3のDownstream設定を定義することによりgRPC-WebもHTTP/3上で配信する挙動になると推測しています。
具体的には、envoyのUDPポートDownstreamにHTTP/3を設定し、HTTP/2のTCPポートでalt-svcをアドバタイズすることで足りると考えられます。

⁋ 2024/04/23↻ 2024/12/18
中馬崇尋
Chuma Takahiro