Cómo acelerar el desarrollo de agentes de RBM con una suscripción de extracción

Los agentes de RBM reciben mensajes y eventos a través de una relación de publicación y suscripción con Google Cloud Pub/Sub. Cuando un usuario responde los mensajes de tu agente, la plataforma de RBM publica esos mensajes en un tema único de Pub/Sub al que solo tiene acceso tu agente. Tu agente accede a esos mensajes y eventos mediante una suscripción a su tema único.

Pub/Sub admite dos tipos de suscripciones: push y pull. Con una suscripción push, Cloud Pub/Sub envía mensajes a la URL de un webhook que usted configura. Con una suscripción de extracción, tienes la responsabilidad de escribir código para crear un objeto de escucha de mensajes de larga duración y confirmar los mensajes a medida que los recibes.

El enfoque más conocido y popular para la mayoría de los desarrolladores es la suscripción de envío. Si usaste API de terceros, es probable que hayas trabajado con URL de devolución de llamada o webhook. Aunque este enfoque es simple, requiere una URL disponible públicamente, lo que obliga a los desarrolladores a implementarse en servidores web públicos cada vez que desean probar un cambio.

En este artículo, le mostraré cómo configurar una suscripción de extracción para pruebas locales y cómo usarla en un entorno de producción con App Engine de Google Cloud.

Configura Pub/Sub para una suscripción de extracción

Si aún no configuraste Pub/Sub para tu agente, sigue las instrucciones en Cloud Pub/Sub a fin de crear tu suscripción inicial.

Una vez que hayas creado tu suscripción, es fácil cambiar de un modelo push a uno de extracción. Navegue a Google Cloud Console y, luego, a la sección Pub/Sub > Suscripciones. Haz clic en el menú ampliado junto a la suscripción que creaste para tu agente y selecciona Editar. Deberías ver una pantalla de configuración similar a la que se muestra a continuación.

Detalles de la suscripción

Configure Delivery Type como Pull y haga clic en Save.

Configura un controlador de suscripciones de extracción asíncrona

A continuación, debes actualizar tu agente de RBM para extraer mensajes de la suscripción. Puedes leer sobre cómo lograr esto con varios lenguajes de programación en Extracción asíncrona o ver algunas de las muestras del agente de RBM, muchas de las cuales usan un modelo de extracción.

En el siguiente código, se muestra cómo configurar un objeto de escucha de suscripción de extracción asíncrono 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 };
}

Para probar los agentes de forma local, lo único que debes hacer es llamar a initPubsub cuando se inicie tu app de Express, y verás las respuestas de impresión messageHandler dentro de tu consola.

Configuración e implementación en App Engine de Google

En un entorno de producción, debe asegurarse de que la suscripción esté siempre disponible. Un enfoque simple es confiar en un trabajo cron para volver a inicializar el objeto de escucha de mensajes de Pub/Sub de forma periódica.

En App Engine, los trabajos cron se pueden usar para programar tareas con diferentes intervalos. Un trabajo cron se configura con una descripción, una URL y un intervalo. En las aplicaciones de Node.js, puedes configurarlas en un archivo cron.yaml, que puedes implementar en App Engine mediante el SDK de Google Cloud. Puede obtener más información sobre otras opciones de configuración de lenguaje en Cómo programar trabajos con cron.yaml.

Debido a que la tarea cron necesita una URL, debes agregar un extremo de URL al router de la app de Express para que lo llame cron, que, a su vez, llamará al método initPubsub de la sección anterior para iniciar el objeto de escucha.

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

Dentro de la devolución de llamada, también debes quitar el objeto de escucha antes de que se vuelva a ejecutar la tarea programada. Por ejemplo, si el trabajo cron se ejecuta cada minuto, debes configurar el parámetro CRON_JOB_TIMEOUT para que sea igual a 60.

A continuación, se muestra la configuración del archivo cron.yaml para ejecutar este extremo cada minuto.

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

Para implementar las tareas cron en App Engine, ejecute lo siguiente:

gcloud app deploy cron.yaml

Después de la implementación, App Engine configura automáticamente la tarea cron, y la tarea se puede ver en App Engine > Trabajos cron, como se muestra a continuación.

Se configuró el trabajo cron

Conclusión y resumen

Usar una suscripción de extracción te permite probar y depurar de forma local, lo que ayuda a acelerar los ciclos de desarrollo y a reducir el tiempo que lleva crear agentes de RBM. Aunque el modelo de extracción requiere cierta configuración y código adicionales en comparación con el modelo de envío, la configuración es simple y solo debe configurarse una vez. Los trabajos cron son una manera fácil de asegurarse de que tu suscripción de extracción siempre esté disponible para controlar el flujo de mensajes de tu agente, y App Engine hace que la configuración y el mantenimiento sean muy bajos.

¡Buena suerte y buena programación!