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
をアドバタイズすることで足りると考えられます。
Chuma Takahiro