Pub/Sub メッセージの作成と応答

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

要件

  • "Hello, World!(Go on App Engine 用)の手順に沿って環境とプロジェクトを設定し、App Engine の Go アプリの構造について理解します。
  • このドキュメントで説明しているサンプル アプリケーションを実行するために必要なので、プロジェクト ID をメモして保存します。

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

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

    go get -u -d github.com/GoogleCloudPlatform/golang-samples/appengine_flexible/pubsub
    cd $GOPATH/src/github.com/GoogleCloudPlatform/golang-samples/appengine_flexible/pubsub
    

    トピックとサブスクリプションを作成する

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

    gcloud beta pubsub topics create YOUR_TOPIC_NAME
    gcloud beta pubsub subscriptions create YOUR_SUBSCRIPTION_NAME \
        --topic YOUR_TOPIC_NAME \
        --push-endpoint \
        https://YOUR_PROJECT_ID.appspot.com/pubsub/push?token=YOUR_TOKEN \
        --ack-deadline 10
    

    YOUR_TOKEN は、ランダムなシークレット トークンで置き換えます。push エンドポイントがこれを使用してリクエストを検証します。

    app.yaml を編集する

    app.yaml を編集して、プロジェクト ID とトピックの環境変数を設定します。

    env_variables:
      PUBSUB_TOPIC: your-topic

    コードをレビューする

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

    このサンプルアプリでは、app.yaml ファイルに設定された値を使用して環境変数を設定します。

    os.Getenv("GOOGLE_CLOUD_PROJECT")
    os.Getenv("PUBSUB_TOPIC")
    

    このインスタンスが受信したメッセージがスライスに格納されます。

    messages   []string
    

    pushHandler 関数は、push されたメッセージを受信して messages スライスに追加します。

    func pushHandler(w http.ResponseWriter, r *http.Request) {
    	msg := &pushRequest{}
    	if err := json.NewDecoder(r.Body).Decode(msg); err != nil {
    		http.Error(w, fmt.Sprintf("Could not decode body: %v", err), http.StatusBadRequest)
    		return
    	}
    
    	messagesMu.Lock()
    	defer messagesMu.Unlock()
    	// Limit to ten.
    	messages = append(messages, string(msg.Message.Data))
    	if len(messages) > maxMessages {
    		messages = messages[len(messages)-maxMessages:]
    	}
    }

    publishHandler 関数は、新しいメッセージをトピックに公開します。

    func publishHandler(w http.ResponseWriter, r *http.Request) {
    	ctx := context.Background()
    
    	msg := &pubsub.Message{
    		Data: []byte(r.FormValue("payload")),
    	}
    
    	if _, err := topic.Publish(ctx, msg).Get(ctx); err != nil {
    		http.Error(w, fmt.Sprintf("Could not publish message: %v", err), 500)
    		return
    	}
    
    	fmt.Fprint(w, "Message published.")
    }

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

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

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

    export GOOGLE_CLOUD_PROJECT=[your-project-id]
    export PUBSUB_TOPIC=[your-topic]
    go run pubsub.go
    

    App Engine で実行する

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

    gcloud app deploy
    

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

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

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

Go の App Engine フレキシブル環境