Агенты 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, как показано ниже.
Подведение итогов и TL;DR
Использование подписки по запросу позволяет тестировать и отлаживать локально, что помогает ускорить циклы разработки и сократить время, необходимое для создания агентов RBM. Хотя модель получения требует дополнительной настройки и кода по сравнению с моделью передачи, установка проста и требует настройки только один раз. Задания Cron — это простой способ убедиться, что ваша подписка по запросу всегда доступна для обработки потока сообщений вашего агента, а App Engine делает установку и обслуживание очень низкими затратами.
Удачи и счастливого кодирования!