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

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

前提条件

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

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

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

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

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

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

gcloud pubsub topics create YOUR_TOPIC_NAME
gcloud 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 を編集して、プロジェクト ID、トピック、検証トークンの各環境変数を設定します。

env_variables:
    PUBSUB_TOPIC: <your-topic-name>
    # This token is used to verify that requests originate from your
    # application. It can be any sufficiently random string.
    PUBSUB_VERIFICATION_TOKEN: <your-token>

コードのレビュー

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

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

topic  = pubsub.topic ENV["PUBSUB_TOPIC"]
PUBSUB_VERIFICATION_TOKEN = ENV["PUBSUB_VERIFICATION_TOKEN"]

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

# List of all messages received by this instance
messages = []

このメソッドは、push されたメッセージを受信して、messages グローバル リストに追加します。

post "/pubsub/push" do
  halt 400 if params[:token] != PUBSUB_VERIFICATION_TOKEN

  message = JSON.parse request.body.read
  payload = Base64.decode64 message["message"]["data"]

  messages.push payload
end

このメソッドは、App Engine ウェブアプリと連携して新しいメッセージを公開し、受信したメッセージを表示します。

get "/" do
  @messages = messages

  slim :index
end

post "/publish" do
  topic.publish params[:payload]

  redirect "/", 303
end

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

ローカルで実行する場合、Google Cloud API を使用するための認証を行うには、Cloud SDK を利用します。前提条件に記載されているとおりに環境を設定していれば、この認証を行う gcloud init コマンドはすでに実行されています。

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

bundle install

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

export GOOGLE_CLOUD_PROJECT=[your-project-id]
export PUBSUB_VERIFICATION_TOKEN=[your-verification-token]
export PUBSUB_TOPIC=[your-topic]
bundle exec ruby app.rb -p 8080

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

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

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

curl -i --data @sample_message.json "localhost:8080/pubsub/push?token=[your-token]"

または

http POST ":8080/pubsub/push?token=[your-token]" < sample_message.json

レスポンス:

HTTP/1.1 200 OK
Content-Type: text/html;charset=utf-8
Content-Length: 13
X-Xss-Protection: 1; mode=block
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
Server: WEBrick/1.3.1 (Ruby/2.3.0/2015-12-25)
Date: Wed, 20 Apr 2016 20:56:23 GMT
Connection: Keep-Alive

Hello, World!

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

App Engine で実行する

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

gcloud app deploy

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

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

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

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