WebSocket を使用した永続的な接続の作成

WebSocket を使用して、クライアント(モバイル デバイスやパソコンなど)から App Engine インスタンスへの永続的な接続を作成できます。接続が開いていると、クライアントとサーバー間でいつでも双方向のデータ交換ができるため、レイテンシが短くなり、リソースの使用効率が向上します。

WebSocket

WebSocket プロトコルは RFC 6455 で定義され、クライアントとサーバー間で全二重の通信チャネルを提供します。このチャネルは「upgrade」ヘッダーを含む HTTP(S) リクエストから開始します。

WebSocket の一般的なユースケースを次に示します。

  • ソーシャル メディア フィード、スポーツのスコア、ニュース、株価などのリアルタイム イベントの更新
  • ソフトウェアやコンテンツの更新などのユーザー通知
  • チャット アプリケーション
  • 共同編集ツール
  • マルチプレーヤー型ゲーム

WebSocket は、追加の設定をしなくても、常にアプリケーションで利用できます。WebSocket 接続は、確立後 1 時間でタイムアウトします。

WebSocket を使用したサンプル アプリケーションの実行

App Engine の PHP 用「Hello, World!」の説明に従って環境とプロジェクトをセットアップし、App Engine での PHP アプリの構造を理解してください。

サンプルアプリのクローンの作成

サンプルアプリをローカルマシンにコピーし、websockets ディレクトリに移動します。

git clone https://github.com/GoogleCloudPlatform/php-docs-samples
cd php-docs-samples/appengine/flexible/websockets/

サンプルをローカルで実行する

ローカルマシンで Hello World アプリを実行するには:

  1. 依存関係をインストールします。

    composer install
    
  2. ローカルのウェブサーバーを起動します。

    php -S localhost:8080 -t web/
    
  3. ウェブブラウザに次のアドレスを入力します。

    http://localhost:8080
    

サンプルを App Engine にデプロイして実行する

アプリケーションを App Engine フレキシブル環境にデプロイするには、app.yaml があるディレクトリから次のコマンドを実行します。

gcloud app deploy

これで、ブラウザから https://[YOUR_PROJECT_ID].appspot.com/ にアクセスできます。

セッション アフィニティ

すべてのクライアントが WebSocket をサポートしているわけではありません。そのため、多くのアプリケーションは、WebSocket をサポートしていないクライアントに対しては最終的に http のロング ポーリングを使用する socket.io などのライブラリを使用します。

通常、App Engine では使用可能なインスタンス間でリクエストが均等に分散されます。ただし、http のロング ポーリングを使用する場合は、特定のユーザーからの複数の連続したリクエストを同じインスタンスに到達させる必要があります。

App Engine が同じユーザーからのリクエストを同じインスタンスに送信できるようにするには、セッション アフィニティを有効にします。有効にすると、App Engine は Cookie を調べて同じユーザーから送信されたリクエストを特定し、これらのリクエストを同じインスタンスにルーティングします。

App Engine のセッション アフィニティは、ベスト エフォート方式で実装されています。アプリを開発するときは、常にセッション アフィニティが保証されているとは限らないと想定する必要があります。以下の場合、クライアントはターゲット インスタンスとのアフィニティを失う可能性があります。

  • App Engine オートスケーラーが、アプリケーションを処理するインスタンスを追加または削除することがあります。アプリケーションが負荷を再度割り当てるので、ターゲット インスタンスが移動することもあります。このリスクを最小限に抑えるため、インスタンスの最小数は、予想される負荷を処理できる程度に設定してください。
  • ターゲット インスタンスでヘルスチェックに失敗した場合、App Engine はセッションを正常なインスタンスに移動します。
  • インスタンスがメンテナンスまたはソフトウェア アップデートのために再起動されると、セッション アフィニティは失われます。App Engine フレキシブル環境の VM インスタンスは毎週再起動されます。

セッション アフィニティは保証されていないため、これを使用するのは、接続が切断された場合に HTTP のロング ポーリングを使用する socket.io などのライブラリの機能を利用するときだけにしてください。セッション アフィニティを使用してステートフル アプリケーションを作成しないでください。

セッション アフィニティの有効化と無効化

デフォルトでは、セッション アフィニティはすべての App Engine アプリケーションで無効になっています。セッション アフィニティはアプリケーションのバージョン レベルで設定され、デプロイするときに有効または無効にできます。

現在の App Engine バージョンでセッション アフィニティを有効にするには、app.yaml ファイルに次のエントリを追加します。

network:
  session_affinity: true

更新された app.yaml を使用してバージョンがデプロイされると、そのインスタンスが利用可能である限り、新しいリクエストは同じインスタンスから処理を開始します。

セッション アフィニティを無効にするには、app.yaml ファイルからこのエントリを削除するか、値を false に設定します。

network:
  session_affinity: false
このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

PHP の App Engine フレキシブル環境に関するドキュメント