編寫及回應 Pub/Sub 訊息

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

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

必備條件

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

複製範例應用程式

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

git clone https://github.com/GoogleCloudPlatform/python-docs-samples
cd python-docs-samples/appengine/flexible/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.yaml 檔案,為您的專案 ID、主題和驗證憑證設定環境變數:

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

程式碼審查

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

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

app.config['PUBSUB_VERIFICATION_TOKEN'] = \
    os.environ['PUBSUB_VERIFICATION_TOKEN']
app.config['PUBSUB_TOPIC'] = os.environ['PUBSUB_TOPIC']

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

MESSAGES = []

pubsub_push() 方法可接收已推送的訊息,並將訊息加入 MESSAGES 全域清單:

@app.route('/pubsub/push', methods=['POST'])
def pubsub_push():
    if (request.args.get('token', '') !=
            current_app.config['PUBSUB_VERIFICATION_TOKEN']):
        return 'Invalid request', 400

    envelope = json.loads(request.data.decode('utf-8'))
    payload = base64.b64decode(envelope['message']['data'])

    MESSAGES.append(payload)

    # Returning any 2xx status indicates successful receipt of the message.
    return 'OK', 200

index() 方法會與 App Engine 網頁應用程式互動,以發布新訊息並顯示收到的訊息:

@app.route('/', methods=['GET', 'POST'])
def index():
    if request.method == 'GET':
        return render_template('index.html', messages=MESSAGES)

    data = request.form.get('payload', 'Example payload').encode('utf-8')

    publisher = pubsub_v1.PublisherClient()
    topic_path = publisher.topic_path(
        current_app.config['PROJECT'],
        current_app.config['PUBSUB_TOPIC'])

    publisher.publish(topic_path, data=data)

    return 'OK', 200

在本機執行範例

在本機執行應用程式範例時,您可以藉由 Cloud SDK 提供驗證以使用 Google Cloud API。假設您是根據必備條件所述來設定環境,那麼您應該已經執行了 gcloud init 指令來提供這項驗證。

請安裝依附元件,建議使用 virtualenv。

Mac OS / Linux

  1. 在專案外部的目錄中建立獨立的 Python 環境,並啟動該環境:
    virtualenv env
    source env/bin/activate
  2. 前往專案目錄,並且安裝依附元件:
    cd YOUR_PROJECT
    pip install  -r requirements.txt

Windows

如果您已安裝 Cloud SDK,那麼電腦上應該會有 Python 2.7,該程式語言通常位於 C:\python27_x64\ (如果電腦是 64 位元系統)。請使用 PowerShell 執行 Python 套件。

  1. 尋找已安裝的 PowerShell
  2. 以滑鼠右鍵按一下 PowerShell 的捷徑,然後以系統管理員的身分啟動 PowerShell。
  3. 嘗試執行 python 指令。如果找不到該指令,請將 Python 資料夾新增至環境的 PATH
    $env:Path += ";C:\python27_x64\"
  4. 在專案外部的目錄中建立獨立的 Python 環境,並啟動該環境:
    python -m virtualenv env
    env\Scripts\activate
  5. 前往專案目錄,並且安裝依附元件:
    cd YOUR_PROJECT
    python -m pip install -r requirements.txt

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

export GOOGLE_CLOUD_PROJECT=[your-project-id]
export PUBSUB_VERIFICATION_TOKEN=[your-verification-token]
export PUBSUB_TOPIC=[your-topic]
python main.py

模擬推播通知

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

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

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

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

回應:

HTTP/1.0 200 OK
Content-Length: 2
Content-Type: text/html; charset=utf-8
Date: Mon, 10 Aug 2015 17:52:03 GMT
Server: Werkzeug/0.10.4 Python/2.7.10

OK

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

在 App Engine 上執行

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

gcloud app deploy

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

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

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

這個網頁
App Engine flexible environment for Python docs