Cloud Run の WebSocket、HTTP/2、gRPC 双方向ストリームのご紹介
Google Cloud Japan Team
※この投稿は米国時間 2021 年 1 月 22 日に、Google Cloud blog に投稿されたものの抄訳です。
このたび、Cloud Run に新しいトラフィック配信機能が追加され、エンドツーエンドの HTTP/2 接続、WebSocket のサポート、gRPC の双方向ストリーミングが可能になりました。これにより、gRPC で提供される全タイプのリモート プロシージャ コールを実行できるようになりました。これらの機能を使用することで、サーバーレス インフラストラクチャを利用しながら、これまでサポートされていなかった種類のアプリケーションを Cloud Run にデプロイできるようになりました。これらの新機能は現在、Cloud Run の全ロケーションの公開プレビューで利用可能になっています。
ストリーミングのサポートは、応答性の高い高性能アプリケーションを構築するうえで重要です。Cloud Run の初回リリースでは、クライアントからのリクエストとサービスの応答に対応したため、ストリーミングをサポートしていませんでした。10 月にはサーバー側ストリーミングのサポートを発表し、サーバーレス コンテナからクライアントへのデータのストリーミングが可能になりました。これにより、従来は 32 MB だった応答の上限を引き上げることができ、gRPC のサーバー側ストリーミングをサポートできるようになりました。しかしこの時点では、WebSocket および gRPC のクライアント ストリーミングと双方向ストリーミングについては対応できていませんでした。
WebSocket と gRPC の双方向ストリーミング
Cloud Run に双方向ストリーミング機能が追加されたことで、WebSocket を使用するアプリケーション(ソーシャル フィード、共同編集、マルチプレーヤー型ゲームなど)を実行できるようになっただけでなく、gRPC 双方向ストリーミング API もすべて実行できるようになりました。これらの双方向ストリーミング機能により、サーバーとクライアントの両方が同じリクエストに応答してデータを交換し続けます。WebSocket と双方向リモート プロシージャ コールを使用すると、応答性の高いアプリケーションや API を構築できます。つまり、Cloud Run で WebSocket のようなプロトコルを使用してチャットアプリを構築したり、gRPC を使用してストリーミング API を設計したりすることができます。
次に示す画像は、共同編集が可能なライブ「ホワイトボード」アプリケーションのサンプルです。このアプリケーションは、Cloud Run でコンテナとして実行され、2 つのブラウザ ウィンドウに 2 つの WebSocket セッションを表示しています。両方のウィンドウのキャンバスがリアルタイムで更新されることに注目してください。
Cloud Run では、追加の構成なしですぐに WebSocket を使用できます。gRPC でクライアント側ストリーミングまたは双方向ストリーミングを使用するには、HTTP/2 のサポートを有効にする必要があります。これについては、次のセクションでご説明します。
Cloud Run で WebSocket のサンプル アプリケーションを試すには、こちらのリンクをクリックして、Socket.io のサンプルのホワイトボード アプリケーションをデプロイしてください。
WebSocket のストリームは、Cloud Run サービスで構成されたリクエスト タイムアウトの影響を受けることに注意してください。WebSocket を使用する際には、リクエスト タイムアウトを適切な値に設定してください。
エンドツーエンドの HTTP/2 のサポート
HTTP/2 は、多くのアプリではサポートされていませんが、Cloud Run では初回リリースからサポートしており、gRPC 用のエンドツーエンド HTTP/2 にも対応しています。これを実現するために、プロトコルを使用するようにクライアントを自動的にアップグレードし、サービスを高速化および効率化します。HTTP/2 のリクエストはこれまで、コンテナに送信される際に、HTTP/1 にダウングレードされていました。
しかし今後は、Cloud Run でエンドツーエンドの HTTP/2 トランスポートを使用できます。この機能強化は、すでに HTTP/2 をサポートしているアプリケーションにおいて有用です。HTTP/2 をサポートしていないアプリの場合、Cloud Run は、HTTP/2 トラフィックがコンテナに到着するまで、トラフィックを処理し続けます。
サービスがエンドツーエンドの HTTP/2 に従ってトラフィックを処理するためには、アプリケーションが HTTP/2 クリアテキスト(「h2c」とも呼ばれる)形式でリクエストを処理できる必要があります。「h2c」プロトコルを試用できるように、Go でサンプルの h2c サーバー アプリケーションを開発しました。このアプリを構築して Cloud Run にデプロイするには、以下のように、リンクされているリポジトリのクローンを作成し、実行します。
このコマンド例の「-use-http2」オプションは、アプリケーションが「h2c」プロトコルをサポートしていること、およびサービスが HTTP/2 のリクエストをダウングレードせずに取得することを示しています。
サービスをデプロイしたら、次のコマンドを実行して、リクエストが HTTP/2 を使用して処理され、HTTP/1 にダウングレードされないことを確認してください。
Google Cloud Console で HTTP/2 を使用するようにサービスを構成することもできます。
使ってみる
このような新しいネットワーク機能により、さまざまなウェブサービスと API を Cloud Run にデプロイし、実行できるようになりました。これらの新機能(プレビュー段階)の詳細は、WebSocket デモアプリまたはサンプルの h2c サーバーアプリでご確認ください。
問題が発生した場合やご提案がある場合は、こちらからお知らせください。また、Cloud Run の未来の形作りにご協力いただける場合は、調査研究へのご参加をお願いいたします。
-シニア デベロッパー アドボケイト Ahmet Alp Balkan