Accélérer le développement d'agents RBM avec un abonnement pull

Les agents RBM reçoivent des messages et des événements via une relation de publication/abonnement avec Google Cloud Pub/Sub. Lorsqu'un utilisateur répond aux messages de votre agent, la plate-forme RBM les publie dans un sujet Pub/Sub unique auquel seul votre agent a accès. Votre agent accède à ces messages et événements via un abonnement à son sujet unique.

Pub/Sub est compatible avec deux types d'abonnements: les abonnements push et les abonnements pull. Avec un abonnement push, Cloud Pub/Sub envoie des messages à une URL de webhook que vous configurez. Avec un abonnement pull, vous êtes chargé d'écrire du code pour créer un écouteur de messages de longue durée et confirmer les messages que vous recevez.

L'abonnement push est l'approche la plus connue et la plus populaire pour la plupart des développeurs. Si vous avez utilisé des API tierces, vous avez probablement déjà utilisé des URL de rappel ou de webhook. Bien que cette approche soit simple, elle nécessite une URL accessible au public, qui oblige les développeurs à effectuer des déploiements sur des serveurs Web publics chaque fois qu'ils souhaitent tester une modification.

Dans cet article, je vais vous montrer comment configurer un abonnement pull pour les tests en local et l'utiliser dans un environnement de production avec App Engine de Google Cloud.

Configurer Pub/Sub pour un abonnement pull

Si vous n'avez pas encore configuré Pub/Sub pour votre agent, suivez les instructions de Cloud Pub/Sub pour créer votre abonnement initial.

Une fois que vous avez créé votre abonnement, il est facile de passer d'un modèle push à un modèle pull. Accédez à la console Google Cloud, puis à la section Pub/Sub > Abonnements. Cliquez sur le menu à développer à côté de l'abonnement que vous avez créé pour votre agent, puis sélectionnez Modifier. Vous devriez voir un écran de configuration semblable à l'image ci-dessous.

Détails de l'abonnement

Définissez le type de diffusion sur Pull et cliquez sur Enregistrer.

Configurer un gestionnaire d'abonnement pull asynchrone

Vous devez ensuite mettre à jour votre agent RBM pour extraire les messages de l'abonnement. Pour découvrir comment procéder avec différents langages de programmation, consultez la page Extraction asynchrone ou examinez certains des exemples d'agent RBM, dont la plupart utilisent un modèle pull.

Le code ci-dessous montre comment configurer un écouteur d'abonnement pull asynchrone en Node.js:

function initPubsub() {
    let pubsub = new PubSub({
        projectId: REPLACE_WITH_GCP_PROJECT_ID,
        keyFilename: REPLACE_WITH_SERVICE_ACCOUNT_KEY_FILE_LOCATION,
    });

    // references an existing subscription, (e.g. rbm-agent-sub)
    let subscription = pubsub.subscription(PUB_SUB_SUBSCRIPTION_NAME);

    // create an event handler to handle messages
    let messageHandler = (message) => {
        console.log(`Received message ${message.id}:`);
        console.log(`\tData: ${message.data}`);
        console.log(`\tAttributes: ${message.attributes}`);

        let userEvent = JSON.parse(message.data);

        // TODO: process the userEvent to create another RBM message
        // "Ack" (acknowledge receipt of) the message
        message.ack();
    };

    // Listen for new messages
    subscription.on('message', messageHandler);

    return { messageHandler: messageHandler, subscription: subscription };
}

Pour tester les agents en local, il vous suffit d'appeler initPubsub au démarrage de l'application Express. Les réponses d'impression messageHandler s'affichent dans la console.

Configuration et déploiement sur Google App Engine

Dans un environnement de production, vous devez vous assurer que l'abonnement est toujours disponible. Une approche simple consiste à utiliser une tâche Cron pour réinitialiser périodiquement l'écouteur de message Pub/Sub.

Dans App Engine, vous pouvez utiliser des tâches Cron pour planifier des tâches avec différents intervalles. Une tâche Cron est configurée avec une description, une URL et un intervalle. Dans les applications Node.js, vous les configurez dans un fichier cron.yaml que vous pouvez déployer sur App Engine à l'aide du SDK Google Cloud. Pour en savoir plus sur les autres configurations de langages, consultez Planifier des tâches avec cron.yaml.

Étant donné que la tâche Cron nécessite une URL, vous devez ajouter un point de terminaison d'URL au routeur de l'application Express qui sera appelé par cron, qui appellera à son tour la méthode initPubsub de la section précédente pour démarrer l'écouteur.

router.get('/pubsubCallback', function(req, res, next) {
  let pubsubConfig = initPubsub();

      // Stop listening once the timeout is hit
      setTimeout(() => {
        pubsubConfig.subscription.removeListener('message', pubsubConfig.messageHandler);
      }, CRON_JOB_TIMEOUT * 1000);

  res.status(200).send();
});

Dans le rappel, vous devez également supprimer l'écouteur avant que la tâche planifiée ne s'exécute à nouveau. Par exemple, si la tâche Cron s'exécute toutes les minutes, vous configurez le paramètre CRON_JOB_TIMEOUT sur 60.

Vous trouverez ci-dessous la configuration du fichier cron.yaml permettant d'exécuter ce point de terminaison toutes les minutes.

cron:
- description: "Processing Pub/Sub messages"
  url: /pubsubCallback
  schedule: every 1 mins

Pour déployer les tâches Cron sur App Engine, exécutez la commande suivante:

gcloud app deploy cron.yaml

Après le déploiement, App Engine configure automatiquement la tâche Cron, et celle-ci est visible sous App Engine > Tâches Cron, comme illustré ci-dessous.

Tâche Cron configurée

Résumé et résumé

Un abonnement pull vous permet de tester et de déboguer localement, ce qui permet d'accélérer les cycles de développement et de réduire le temps nécessaire pour créer des agents RBM. Bien que le modèle pull nécessite une configuration et un code supplémentaires par rapport au modèle push, la configuration est simple et ne doit être définie qu'une seule fois. Les tâches Cron permettent de s'assurer que votre abonnement pull est toujours disponible pour gérer le flux de messages de votre agent. De plus, App Engine permet de configurer et de gérer des appareils à très faible coût.

Bonne chance et bon codage !