Escribe y responde 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 se pueden suscribir a ese tema para recibir los mensajes.

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

Requisitos previos

  • Sigue las instrucciones de "Hello, World!" para Node.js en App Engine si quieres configurar tu entorno y el proyecto y comprender cómo se estructuran las aplicaciones Node.js 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.

Clona la app de muestra

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

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

Crea un tema y una suscripción

Crea un tema y una suscripción que incluyan la especificación del 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 por un token secreto y aleatorio. El extremo push lo utiliza para verificar las solicitudes.

Configura variables del entorno

Edita app.standard.yaml con el fin de establecer las variables de entorno para tu ID de proyecto, tema y token de verificación.

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

Revisión de código

La app de muestra utiliza las bibliotecas cliente de Google Cloud.

La app de muestra utiliza los valores que estableciste en el archivo app.standard.yaml para configurar las variables de entorno. El controlador de las solicitudes push utiliza estos valores para confirmar que la solicitud provenga de Pub/Sub y que se origine en una fuente confiable:

// The following environment variables are set by app.standard.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);

La app de muestra mantiene una lista global a fin de almacenar los mensajes que recibe esta instancia:

// List of all messages received by this instance
var messages = [];

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

Este método interactúa con la app web de App Engine para publicar mensajes nuevos y mostrar los recibidos.

app.get('/', (req, res) => {
  res.render('index', {messages: messages});
});

app.post('/', formBodyParser, async (req, res, next) => {
  if (!req.body.payload) {
    res.status(400).send('Missing payload');
    return;
  }

  let data = Buffer.from(req.body.payload);
  try {
    let messageId = await publisher.publish(data);
    res.status(200).send(`Message ${messageId} sent.`);
  } catch (error) {
    next(error);
  }
});

Ejecuta la muestra de manera local

En la ejecución local, puedes utilizar el SDK de Cloud para proporcionar autenticación a fin de emplear las API de Google Cloud. Si configuraste tu entorno como se describe en Requisitos previos, entonces ya ejecutaste el comando gcloud init que proporciona esta autenticación.

A continuación, configura las variables de 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]
npm install
npm start

Simula notificaciones push

La aplicación puede enviar mensajes de forma local, pero no puede recibir mensajes push del mismo modo. Sin embargo, puedes simular un mensaje push mediante una solicitud HTTP al extremo de notificación push local. La muestra incluye el archivo sample_message.json.

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

curl -H "Content-Type: application/json" -i --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.1 200 OK
Connection: keep-alive
Date: Mon, 31 Aug 2015 22:19:50 GMT
Transfer-Encoding: chunked
X-Powered-By: Express

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

Ejecuta en App Engine

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

gcloud app deploy app.standard.yaml

Ahora puedes acceder a la aplicación en https://[YOUR_PROJECT_ID].appspot.com. Puedes utilizar el formulario para enviar mensajes, pero no hay forma de garantizar cuál 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 estándar de App Engine para Node.js