編寫及回應 Pub/Sub 訊息

Google 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 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.yaml

    編輯 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 檔案中設定的值來設定環境變數。推送要求處理常式會用這些值來確認要求來自 Pub/Sub 且是來自可信任的來源:

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

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

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

    這個方法可接收那些已推送的訊息並將訊息新增至 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 SDK 提供驗證,以使用 Google Cloud API。假設您已按照事前準備的說明設定環境,那麼您應該已經透過執行 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
    

    模擬推播通知

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

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

    curl -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
    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 彈性環境文件