在本地测试Google Cloud PubSub推送端点

时间:2016-07-29 20:58:24

标签: google-cloud-pubsub

尝试找出在本地测试PubSub推送端点的最佳方法。我们尝试使用ngrok.io,但您必须拥有该域才能进行白名单(这样做的工具也会被破坏...导致无限重定向循环)。我们还尝试在本地模拟PubSub。我能够发布和拉取,但我不能让推送订阅工作。我们正在使用像这样的本地Flask网络服务器:

virtual

以下产生无结果:

@app.route('/_ah/push-handlers/events', methods=['POST'])
def handle_message():
    print request.json
    return jsonify({'ok': 1}), 200

当我们尝试创建对HTTP端点的订阅时,它会对我们大吼大叫(如果您不使用HTTPS,则会显示实时PubSub)。也许这是设计的? Pull工作得很好......关于如何最好地开发PubSub的任何想法在本地推送端点?

2 个答案:

答案 0 :(得分:1)

latest PubSub library documentation at the time of writing之后,以下示例创建具有推送配置的订阅。

要求

我已经测试了以下要求:

  • Google Cloud SDK 285.0.1(用于PubSub本地模拟器)
  • Python 3.8.1
  • Python软件包(requirements.txt):
flask==1.1.1
google-cloud-pubsub==1.3.1

在本地运行PubSub仿真器

export PUBSUB_PROJECT_ID=fake-project
gcloud beta emulators pubsub start --project=$PUBSUB_PROJECT_ID

默认情况下,PubSub仿真器在端口8085上启动。 项目参数可以是任何东西,没关系。

烧瓶服务器

考虑以下server.py

from flask import Flask, jsonify, request

app = Flask(__name__)


@app.route('/_ah/push-handlers/events', methods=['POST'])
def handle_message():
    print(request.json)
    return jsonify({'ok': 1}), 200


if __name__ == "__main__":
    app.run(port=5000)

运行服务器(从端口5000开始):

python server.py

PubSub示例

考虑以下pubsub.py

import sys

from google.cloud import pubsub_v1


if __name__ == "__main__":
    project_id = sys.argv[1]

    # 1. create topic (events)
    publisher_client = pubsub_v1.PublisherClient()
    topic_path = publisher_client.topic_path(project_id, "events")
    publisher_client.create_topic(topic_path)

    # 2. create subscription (test_push with push_config)
    subscriber_client = pubsub_v1.SubscriberClient()
    subscription_path = subscriber_client.subscription_path(
        project_id, "test_push"
    )
    subscriber_client.create_subscription(
        subscription_path,
        topic_path,
        push_config={
          'push_endpoint': 'http://localhost:5000/_ah/push-handlers/events'
        }
    )

    # 3. publish a test message
    publisher_client.publish(
        topic_path,
        data='{"test": 123}'.encode("utf-8")
    )

最后,运行此脚本:

PUBSUB_EMULATOR_HOST=localhost:8085 \
PUBSUB_PROJECT_ID=fake-project \
python pubsub.py $PUBSUB_PROJECT_ID

结果

然后,您可以在Flask服务器的日志中查看结果:

{'subscription': 'projects/fake-project/subscriptions/test_push', 'message': {'data': 'eyJ0ZXN0IjogMTIzfQ==', 'messageId': '1', 'attributes': {}}}
127.0.0.1 - - [22/Mar/2020 12:11:00] "POST /_ah/push-handlers/events HTTP/1.1" 200 -

请注意,您可以检索发送的消息,在此处以base64(message.data)进行编码:

$ echo "eyJ0ZXN0IjogMTIzfQ==" | base64 -d
{"test": 123}

当然,您也可以使用Python进行解码。

答案 1 :(得分:-1)

这可能是模拟器中的已知错误(即将发布),其中与订阅一起创建的推送端点不起作用。该bug只影响初始推送配置;修改现有订阅的推送配置应该有效。你能试试吗?

相关问题