Escribir y responder mensajes de Pub/Sub

Cloud Pub/Sub proporciona mensajería asíncrona entre aplicaciones de varios a varios de forma confiable. Las aplicaciones de publicador pueden enviar mensajes a un tema, y otras aplicaciones pueden suscribirse a ese tema para recibir los mensajes.

En este documento, se describe cómo usar la biblioteca cliente de Google Cloud para enviar y recibir mensajes de Cloud Pub/Sub en una aplicación que se ejecuta en el entorno flexible.

Requisitos

  • Sigue las instrucciones que se detallan en "¡Hola, mundo!" para Python en App Engine a fin de configurar tu entorno y proyecto, y comprender cómo se estructuran las aplicaciones de Python en App Engine.
  • Anota y guarda el ID del proyecto, ya que lo necesitarás para ejecutar la aplicación de muestra que se describe en este documento.

Clonar la aplicación de muestra

Copia las aplicaciones de muestra en tu máquina local y navega hasta el directorio pubsub:

git clone https://github.com/GoogleCloudPlatform/python-docs-samples
cd python-docs-samples/appengine/flexible/pubsub

Crear un tema y una suscripción

Crea un tema y una suscripción, lo que incluye especificar el extremo al que el servidor Pub/Sub debe enviar solicitudes:

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

Reemplaza YOUR_TOKEN con un token secreto aleatorio. El extremo lo utiliza para verificar las solicitudes.

Configurar variables del entorno

Edita el archivo app.yaml a fin de establecer las variables del entorno para el ID del proyecto, el tema y el token de verificación:

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

Revisión de código

La aplicación de muestra usa las bibliotecas cliente de Google Cloud.

La aplicación de muestra utiliza los valores que estableciste en el archivo app.yaml para configurar las variables del entorno. El controlador de las solicitudes de notificación utiliza estos valores para confirmar que la solicitud provenga de Pub/Sub y que se haya originado en una fuente confiable:

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

La aplicación de muestra mantiene una lista global a fin de almacenar los mensajes recibidos por esta instancia:

MESSAGES = []

El método pubsub_push() recibe mensajes enviados y los agrega a la lista global 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

El método index() interactúa con la aplicación web de App Engine a fin de publicar mensajes nuevos y mostrar los mensajes recibidos:

@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')

    # Consider initialzing the publisher client outside this function
    # for low latency publish.
    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

Ejecutar la muestra de forma local

Cuando se ejecutan muestras localmente, puedes usar el SDK de Cloud a fin de proporcionar autenticación para usar las API de Google Cloud. Si configuraste tu entorno como se describe en Requisitos previos, ya ejecutaste el comando gcloud init, que proporciona esta autenticación.

Instala dependencias, preferiblemente con un virtualenv.

macOS/Linux

  1. Crea un entorno aislado de Python en un directorio externo al proyecto y actívalo:
    virtualenv env
    source env/bin/activate
  2. Navega al directorio del proyecto y, luego, instala las dependencias:
    cd YOUR_PROJECT
    pip install  -r requirements.txt

Windows

Si instalaste el SDK de Cloud, ya deberías tener instalado Python 2.7, por lo general, en C:\python27_x64\ (para sistemas de 64 bits). Usa PowerShell con el fin de ejecutar tus paquetes de Python.

  1. Ubica la instalación de PowerShell.
  2. Haz clic derecho en el acceso directo a PowerShell y, luego, inícialo como administrador.
  3. Intenta ejecutar el comando python. Si no se encuentra, agrega la carpeta de Python a la PATH de tu entorno.
    $env:Path += ";C:\python27_x64\"
  4. Crea un entorno aislado de Python en un directorio externo al proyecto y actívalo:
    python -m virtualenv env
    env\Scripts\activate
  5. Navega al directorio del proyecto y, luego, instala las dependencias:
    cd YOUR_PROJECT
    python -m pip install -r requirements.txt

A continuación, establece las variables del entorno antes de iniciar la aplicación:

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

Simular notificaciones push

La aplicación puede enviar mensajes de forma local, pero no puede recibir mensajes push localmente. Sin embargo, puedes simular un mensaje push por medio del envío de una solicitud HTTP a la terminal local de notificación push. La muestra incluye el archivo sample_message.json.

Puedes usar curl o httpie para enviar una solicitud HTTP POST:

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

O

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

Respuesta:

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

Una vez completada la solicitud, puedes actualizar localhost:8080 y ver el mensaje en la lista de mensajes recibidos.

Ejecutar en App Engine

Para implementar la aplicación de demostración en App Engine con la herramienta de línea de comandos de gcloud, ejecuta el siguiente comando desde el directorio que contiene tu archivo app.yaml:

gcloud app deploy

Ahora puedes acceder a la aplicación en https://[YOUR_PROJECT_ID].appspot.com. Puedes usar el formulario para enviar mensajes, pero no hay forma de garantizar qué instancia de tu aplicación recibirá la notificación. Puedes enviar varios mensajes y actualizar la página para ver el mensaje recibido.

¿Te ha resultado útil esta página? Enviar comentarios:

Enviar comentarios sobre...

Documentación del entorno de App Engine Flexible para Python