Écrire des messages Pub/Sub et y répondre

Cloud Pub/Sub fournit une messagerie asynchrone fiable de type "plusieurs à plusieurs" entre applications. Les applications de type "éditeur" peuvent envoyer des messages à un sujet et d'autres applications peuvent s'abonner à ce sujet pour recevoir les messages.

Ce document explique comment utiliser la bibliothèque cliente Google Cloud pour envoyer et recevoir des messages Cloud Pub/Sub dans une application exécutée dans l'environnement flexible.

Prérequis

  • Suivez les instructions de la section "Hello, World!" pour Node.js sur App Engine pour configurer votre environnement et votre projet. Ces instructions vous permettront également de comprendre la structure des applications Node.js dans App Engine.
  • Notez et enregistrez l'ID de votre projet. Vous en aurez besoin pour exécuter l'exemple d'application décrit dans ce document.

Cloner l'exemple d'application

Copiez les exemples d'applications sur votre ordinateur local et accédez au répertoire pubsub :

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

Créer un sujet et un abonnement

Créez un sujet et un abonnement, pour lesquels vous devez spécifier le point de terminaison auquel le serveur Pub/Sub doit envoyer des requêtes :

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

Remplacez YOUR_TOKEN par un jeton secret aléatoire. Le point de terminaison push l'utilise pour vérifier les requêtes.

Définir des variables d'environnement

Modifiez le fichier app.flexible.yaml pour définir les variables d'environnement de votre ID de projet, de votre sujet et de votre jeton de vérification :

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

Examiner le code

L'exemple d'application utilise les bibliothèques clientes Google Cloud.

L'exemple d'application utilise les valeurs que vous avez définies dans le fichier app.flexible.yaml pour configurer les variables d'environnement. Le gestionnaire de demandes push utilise ces valeurs pour confirmer que la requête provient de Pub/Sub et d'une source fiable :

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

L'exemple d'application gère une liste globale pour stocker les messages reçus par cette instance :

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

Cette méthode reçoit les messages envoyés et les ajoute à la liste globale des 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();
});

Cette méthode interagit avec l'application Web App Engine pour publier de nouveaux messages et afficher les messages reçus :

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);
  }
});

Exécuter l'exemple en local

Lorsque vous exécutez l'exemple en local, vous pouvez recourir au SDK Cloud pour fournir les éléments d'authentification permettant d'utiliser les API Google Cloud. Si vous avez configuré votre environnement conformément à la procédure décrite dans les conditions préalables, vous avez déjà exécuté la commande gcloud init, qui fournit ces éléments d'authentification.

Définissez ensuite les variables d'environnement avant de démarrer votre application :

export GOOGLE_CLOUD_PROJECT=[your-project-id]
export PUBSUB_VERIFICATION_TOKEN=[your-verification-token]
export PUBSUB_TOPIC=[your-topic]
npm install
npm start

Simuler des notifications push

L'application peut envoyer des messages en local, mais ne peut pas recevoir de messages push en local. Vous pouvez toutefois simuler un message push en adressant une requête HTTP au point de terminaison de notification push local. L'exemple comprend le fichier sample_message.json.

Vous pouvez utiliser curl ou httpie pour envoyer une requête HTTP POST :

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

Ou

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

Réponse :

HTTP/1.1 200 OK
Connection: keep-alive
Date: Mon, 31 Aug 2015 22:19:50 GMT
Transfer-Encoding: chunked
X-Powered-By: Express

Une fois la requête traitée, vous pouvez actualiser localhost:8080 pour afficher le message dans la liste des messages reçus.

Exécuter l'application sur App Engine

Pour déployer l'application de démonstration sur App Engine à l'aide de l'outil de ligne de commande gcloud, exécutez la commande suivante à partir du répertoire où se trouve votre fichier app.flexible.yaml :

gcloud app deploy app.flexible.yaml

Vous pouvez maintenant accéder à l'application à l'adresse https://[YOUR_PROJECT_ID].appspot.com. Vous pouvez utiliser le formulaire pour envoyer des messages (mais vous ne pourrez pas forcément savoir quelle instance de votre application recevra la notification). Vous pouvez envoyer plusieurs messages et actualiser la page pour afficher le message reçu.

Cette page vous a-t-elle été utile ? Évaluez-la :

Envoyer des commentaires concernant…

Environnement flexible App Engine pour les documents Node.js