編寫及回應 Pub/Sub 訊息

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

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

事前準備

  • 按照 App Engine 上適用於 Node.js 的「Hello, World!」中的操作說明來設定您的環境和專案,並進一步瞭解如何在 App Engine 中建構 Node.js 應用程式。
  • 請記下並儲存您的專案 ID,因為您需要這些資訊來執行本文所述的應用程式範例。

    複製應用程式範例

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

    git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples
    cd nodejs-docs-samples/appengine/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 替換成私密的隨機憑證,推送端點會使用此憑證來驗證要求。

    編輯 app.flexible.yaml

    編輯 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: messages });
    });
    
    app.post('/', formBodyParser, (req, res, next) => {
      if (!req.body.payload) {
        res.status(400).send('Missing payload');
        return;
      }
    
      publisher.publish(Buffer.from(req.body.payload), (err) => {
        if (err) {
          next(err);
          return;
        }
        res.status(200).send('Message sent');
      });
    });

    在本機上執行範例

    在本機上執行應用程式範例時,您可以使用 Google 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 ":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 上執行

    如要使用 gcloud 指令列工具,將示範應用程式部署至 App Engine,請從 app.flexible.yaml 所在的目錄執行下列指令:

    gcloud app deploy app.flexible.yaml
    

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

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

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

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