Pub/Sub メッセージの作成とレスポンス

リージョン ID

REGION_ID は、アプリの作成時に選択したリージョンに基づいて Google が割り当てる省略形のコードです。一部のリージョン ID は、一般的に使用されている国や州のコードと類似しているように見える場合がありますが、このコードは国または州に対応するものではありません。2020 年 2 月以降に作成されたアプリの場合、REGION_ID.r が App Engine の URL に含まれています。この日付より前に作成されたアプリの場合、URL のリージョン ID は省略可能です。

詳しくは、リージョン ID をご覧ください。

Pub/Sub は、信頼できる多対多の非同期メッセージングをアプリケーション間で行います。パブリッシャー アプリケーションはメッセージをトピックに送信し、その他のアプリケーションはそのトピックにサブスクライブしてメッセージを受信できます。

このドキュメントでは、Cloud クライアント ライブラリを使用して PHP アプリで Pub/Sub メッセージを送受信する方法について説明します。

前提条件

  • App Engine の PHP 用「Hello, World!」の説明に従って環境とプロジェクトをセットアップし、App Engine での PHP アプリの構造を理解してください。
  • このドキュメントで説明しているサンプルアプリを実行する際に必要となるため、プロジェクト ID を書き留めておきます。

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

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

    git clone https://github.com/GoogleCloudPlatform/php-docs-samples.git
    cd php-docs-samples/pubsub
    

    トピックとサブスクリプションの作成

    トピックとサブスクリプションを作成します。Pub/Sub サーバーがリクエストを送信するエンドポイントも指定します。

    gcloud pubsub topics create YOUR_TOPIC_NAME
    gcloud pubsub subscriptions create YOUR_SUBSCRIPTION_NAME \
        --topic YOUR_TOPIC_NAME
    

    環境変数の設定

    index.php ファイルを編集して、トピックとサブスクリプションの環境変数を設定します。

    $container->set('topic', 'php-example-topic');
    $container->set('subscription', 'php-example-subscription');

    コードレビュー

    サンプルアプリでは、Cloud クライアント ライブラリを使用しています。

    このサンプルアプリでは、app.yaml ファイルに設定された値を使用して環境変数を構成します。push リクエスト ハンドラは、これらの値を使用して、リクエストが Pub/Sub からのものであり、信頼できる送信元から送信されていることを確認します。

    runtime: php
    env: flex
    

    このサンプルアプリは、このインスタンスで受信したメッセージをグローバル リストに保存します。

    $messages = [];
    

    pull メソッドは、作成したトピックからメッセージを取得し、メッセージ リストに追加します。

    // get PULL pubsub messages
    $pubsub = new PubSubClient([
        'projectId' => $projectId,
    ]);
    $subscription = $pubsub->subscription($subscriptionName);
    $pullMessages = [];
    foreach ($subscription->pull(['returnImmediately' => true]) as $pullMessage) {
        $pullMessages[] = $pullMessage;
        $messages[] = $pullMessage->data();
    }
    // acknowledge PULL messages
    if ($pullMessages) {
        $subscription->acknowledgeBatch($pullMessages);
    }

    publish メソッドは、新しいメッセージをトピックに公開します。

    if ($message = (string) $request->getBody()) {
        // Publish the pubsub message to the topic
        $pubsub = new PubSubClient([
            'projectId' => $projectId,
        ]);
        $topic = $pubsub->topic($topicName);
        $topic->publish(['data' => $message]);
        return $response->withStatus(204);
    }

    サンプルのローカルでの実行

    ローカルで実行する場合、Google Cloud CLI で Google Cloud APIs を使用するための認証を行うことができます。前提条件に記載されているとおりに環境をセットアップしていれば、この認証のための gcloud init コマンドはすでに実行されています。

    Composer を使用して依存関係をインストールします。

    composer install
    

    次に、アプリケーションを起動する前に環境変数を設定します。

    プッシュ通知のシミュレート

    アプリケーションは、ローカルでメッセージを送信できますが、push メッセージを受信することはできません。push メッセージをシミュレートするには、ローカルのプッシュ通知エンドポイントに HTTP リクエストを送信します。このサンプルには、sample_message.json というファイルが含まれています。

    curl または httpie クライアントを使用して、HTTP POST リクエストを送信できます。

    レスポンス:

    リクエストの完了後、localhost:8080 を更新すると、受信メッセージのリストにメッセージが表示されます。

    App Engine 上で実行する

    gcloud コマンドライン ツールを使用してデモアプリを App Engine にデプロイするには、app.yaml ファイルが配置されているディレクトリから次のコマンドを実行します。

    gcloud app deploy
    

    これで、https://PROJECT_ID.REGION_ID.r.appspot.com のアプリケーションにアクセスできます。フォームを使用してメッセージを送信できますが、アプリケーションのどのインスタンスが通知を受信するかはわかりません。複数のメッセージを送信してページを更新すると、受信メッセージを確認できます。