編寫及回應 Pub/Sub 訊息

Cloud Pub/Sub 在應用程式之間提供可靠且多對多的非同步訊息傳遞功能。發佈者應用程式能將訊息傳送到「主題」,其他應用程式訂閱該主題後就能收到訊息。

本文件說明如何使用 Google Cloud 用戶端程式庫,透過彈性環境中執行的應用程式傳送及接收 Cloud Pub/Sub 訊息。

必備條件

複製範例應用程式

將範例應用程式複製到您的本機電腦,然後前往 pubsub 目錄:

git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples
cd nodejs-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。推送端點會使用這個憑證來驗證要求。

設定環境變數

編輯 app.flexible.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_VERIFICATION_TOKEN

程式碼審查

應用程式範例使用 Google Cloud 用戶端程式庫

應用程式範例會使用您在 app.flexible.yaml 檔案中設定的值來設定環境變數。推送要求處理常式會使用這些值來確認要求是來自 Pub/Sub,而且是由可信任的來源發出:

// The following environment variables are set by app.flexible.yaml when
// running on App Engine, but will need to be manually set when running locally.
var PUBSUB_VERIFICATION_TOKEN = process.env.PUBSUB_VERIFICATION_TOKEN;
var pubsub = gcloud.pubsub({
    projectId: process.env.GOOGLE_CLOUD_PROJECT
});
var topic = pubsub.topic(process.env.PUBSUB_TOPIC);

範例應用程式會維護一份全域清單,以便儲存此執行個體收到的訊息:

// List of all messages received by this instance
var messages = [];

這個方法可接收已推送的訊息,並將這些訊息新增至 messages 全域清單:

app.post('/pubsub/push', jsonBodyParser, (req, res) => {
  if (req.query.token !== PUBSUB_VERIFICATION_TOKEN) {
    res.status(400).send();
    return;
  }

  // The message is a unicode string encoded in base64.
  const message = Buffer.from(req.body.message.data, 'base64').toString(
    'utf-8'
  );

  messages.push(message);

  res.status(200).send();
});

此方法會與 App Engine 網路應用程式互動,以發佈新訊息並顯示收到的訊息:

app.get('/', (req, res) => {
  res.render('index', {messages, tokens, claims});
});

app.post('/', formBodyParser, async (req, res, next) => {
  if (!req.body.payload) {
    res.status(400).send('Missing payload');
    return;
  }

  const data = Buffer.from(req.body.payload);
  try {
    const messageId = await topic.publish(data);
    res.status(200).send(`Message ${messageId} sent.`);
  } catch (error) {
    next(error);
  }
});

在本機執行範例

在本機執行應用程式範例時,您可以透過 Cloud SDK 提供驗證,以使用 Google Cloud API。如果您是根據必備條件一節中的指示設定環境,您應該已執行提供這項驗證的 gcloud init 指令。

接著設定環境變數,然後啟動應用程式:

export GOOGLE_CLOUD_PROJECT=[your-project-id]
export PUBSUB_VERIFICATION_TOKEN=[your-verification-token]
export PUBSUB_TOPIC=[your-topic]
npm install
npm start

模擬推播通知

應用程式可在本機傳送訊息,但是無法在本機接收推送訊息。然而,您可以向本機推播通知端點提出 HTTP 要求,藉此模擬推送訊息。範例包括 sample_message.json 檔案。

您可以使用 curlhttpie 來傳送 HTTP POST 要求:

curl -H "Content-Type: application/json" -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
Connection: keep-alive
Date: Mon, 31 Aug 2015 22:19:50 GMT
Transfer-Encoding: chunked
X-Powered-By: Express

完成要求後,您可以重新整理 localhost:8080,並在收到訊息的清單中查看訊息。

在 App Engine 上執行

您可以從 app.flexible.yaml 所在的目錄執行下列指令,就可以使用 gcloud 指令列工具將示範應用程式部署到 App Engine:

gcloud app deploy app.flexible.yaml

您現在可以在 https://[YOUR_PROJECT_ID].appspot.com 存取應用程式,並可以使用表單提交訊息,但是系統無法保證應用程式的哪個執行個體會收到通知。此外,您也可以傳送多則訊息,並透過重新整理頁面來查看收到的訊息。

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
Node.js 適用的 App Engine 彈性環境文件