Как ускорить разработку агента RBM с помощью подписки по запросу

Агенты RBM получают сообщения и события через отношения публикации/подписки с Google Cloud Pub/Sub . Когда пользователь отвечает на сообщения вашего агента, платформа RBM публикует эти сообщения в уникальной теме Pub/Sub, доступ к которой есть только у вашего агента. Ваш агент получает доступ к этим сообщениям и событиям через подписку на свою уникальную тему.

Pub/Sub поддерживает два типа подписки: push и pull . При принудительной подписке Cloud Pub/Sub отправляет сообщения на настроенный вами URL-адрес веб-перехватчика. При подписке по запросу вы отвечаете за написание кода для создания долговременного прослушивателя сообщений и подтверждения сообщений по мере их получения.

Более знакомый и популярный подход для большинства разработчиков — это push-подписка. Если вы использовали сторонние API, то вы, вероятно, работали с URL-адресами обратного вызова/веб-перехватчика. Хотя этот подход прост, для него требуется общедоступный URL-адрес, что вынуждает разработчиков выполнять развертывание на общедоступных веб-серверах каждый раз, когда они хотят протестировать изменение.

В этой статье я покажу вам, как настроить подписку по запросу для локального тестирования и как использовать эту подписку в рабочей среде с Google Cloud App Engine.

Настройка Pub/Sub для подписки по запросу

Если вы еще не настроили Pub/Sub для своего агента, следуйте инструкциям в Cloud Pub/Sub , чтобы создать первоначальную подписку.

После того, как вы создали свою подписку, вы можете легко переключиться с модели push на модель pull. Перейдите в Google Cloud Console , затем в раздел Pub/Sub > Подписки . Щелкните дополнительное меню рядом с подпиской, которую вы создали для своего агента, и выберите Изменить . Вы должны увидеть экран конфигурации, похожий на изображение ниже.

Детали подписки

Установите для параметра Тип доставки значение «По запросу» и нажмите «Сохранить» .

Настройка обработчика асинхронной подписки по запросу

Затем вам нужно обновить агент RBM, чтобы получать сообщения из подписки. Вы можете прочитать о том, как это сделать с помощью различных языков программирования в Asynchronous pull , или взглянуть на некоторые примеры агентов RBM, многие из которых используют модель pull.

В приведенном ниже коде показано, как настроить прослушиватель асинхронной подписки по запросу в 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 };
}

Чтобы протестировать агенты локально, все, что вам нужно сделать, это вызвать initPubsub при запуске вашего экспресс-приложения, и вы увидите, что сообщения messageHandler печатают ответы в вашей консоли.

Настройка и развертывание в Google App Engine

В производственной среде необходимо убедиться, что подписка всегда доступна. Один из простых подходов — использовать задание cron для периодической повторной инициализации прослушивателя сообщений Pub/Sub.

В App Engine задания cron можно использовать для планирования задач с разными интервалами. Задание cron настраивается с описанием, URL-адресом и интервалом. В приложениях Node.js вы настраиваете их в файле cron.yaml, который можно развернуть в App Engine с помощью Google Cloud SDK . Вы можете прочитать о других настройках конфигурации языка в Планировании заданий с помощью cron.yaml .

Поскольку задаче cron требуется URL-адрес, вам необходимо добавить конечную точку URL-адреса к маршрутизатору экспресс-приложения, который будет вызываться cron, который, в свою очередь, вызовет метод initPubsub из предыдущего раздела для запуска прослушивателя.

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

В рамках обратного вызова вам также необходимо удалить прослушиватель перед повторным выполнением запланированной задачи. Например, если задание cron запускается каждую минуту, вы настраиваете параметр CRON_JOB_TIMEOUT равным 60 .

Ниже приведена конфигурация файла cron.yaml для выполнения этой конечной точки каждую минуту.

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

Чтобы развернуть задачи cron в App Engine, выполните следующее:

gcloud app deploy cron.yaml

После развертывания App Engine автоматически настраивает задачу cron, и эту задачу можно просмотреть в разделе App Engine > Задания Cron, как показано ниже.

Настроенное задание cron

Подведение итогов и TL;DR

Использование подписки по запросу позволяет тестировать и отлаживать локально, что помогает ускорить циклы разработки и сократить время, необходимое для создания агентов RBM. Хотя модель получения требует дополнительной настройки и кода по сравнению с моделью передачи, установка проста и требует настройки только один раз. Задания Cron — это простой способ убедиться, что ваша подписка по запросу всегда доступна для обработки потока сообщений вашего агента, а App Engine делает установку и обслуживание очень низкими затратами.

Удачи и счастливого кодирования!