Технологии
Статья
Публикация-подписка: одно событие для нескольких систем
Заказ создан - склад, аналитика и сервис уведомлений получают событие каждый для своей задачи. Разбираем паттерн Publish-Subscribe.
Один заказ запускает несколько процессов. Складу нужно подготовить отгрузку, аналитике - учесть продажу, сервису уведомлений - сообщить клиенту о приёме заказа.
Чтобы отправитель не обращался к каждому получателю отдельно, используют публикацию-подписку (Publish-Subscribe). Он публикует событие в согласованный канал, а каждый подходящий подписчик получает свою копию сообщения.
Как это работает
Источник сообщает о факте - например, «Заказ создан». Для склада, аналитики и уведомлений создаются отдельные подписки. Каждый получатель обрабатывает событие по собственным правилам.
Новый сервис можно подключить через новую подписку. Если ему достаточно существующих данных, менять логику отправителя не требуется. Формат и смысл события при этом остаются общим контрактом.
Подписка и обработчик - разные уровни
Одну подписку могут обслуживать несколько экземпляров приложения. Внутри неё работа может распределяться между обработчиками по принципу «точка-точка». При этом другие подписки продолжают получать свои копии события.
Так система уведомлений может увеличить число обработчиков, сохранив отдельный поток событий для склада и аналитики.
Что нужно настроить
Хранение. Получит ли временно отключённый подписчик пропущенные события и как долго они будут доступны.
Повторы. Когда сообщение доставляется снова и как получатель распознаёт дубли.
Ошибки. Где разбирать сообщения, которые не удалось обработать.
Ограничения. Как медленный подписчик влияет на очереди, хранилище и общие ресурсы.
Порядок. Нужно ли обрабатывать события одного объекта последовательно.
Раздельные подписки помогают уменьшить взаимное влияние получателей. Полная изоляция сбоев зависит от реализации, лимитов и доступных ресурсов.
Публикация-подписка подходит, когда один факт нужен нескольким участникам. Для задания, которое должен выполнить один из доступных исполнителей, обычно выбирают канал «точка-точка».