Технологии

Статья

Публикация-подписка: одно событие для нескольких систем

Заказ создан - склад, аналитика и сервис уведомлений получают событие каждый для своей задачи. Разбираем паттерн Publish-Subscribe.

Один заказ запускает несколько процессов. Складу нужно подготовить отгрузку, аналитике - учесть продажу, сервису уведомлений - сообщить клиенту о приёме заказа.

Чтобы отправитель не обращался к каждому получателю отдельно, используют публикацию-подписку (Publish-Subscribe). Он публикует событие в согласованный канал, а каждый подходящий подписчик получает свою копию сообщения.

Как это работает

Источник сообщает о факте - например, «Заказ создан». Для склада, аналитики и уведомлений создаются отдельные подписки. Каждый получатель обрабатывает событие по собственным правилам.

Новый сервис можно подключить через новую подписку. Если ему достаточно существующих данных, менять логику отправителя не требуется. Формат и смысл события при этом остаются общим контрактом.

Иллюстрация паттерна «Публикация-подписка»

Подписка и обработчик - разные уровни

Одну подписку могут обслуживать несколько экземпляров приложения. Внутри неё работа может распределяться между обработчиками по принципу «точка-точка». При этом другие подписки продолжают получать свои копии события.

Так система уведомлений может увеличить число обработчиков, сохранив отдельный поток событий для склада и аналитики.

Что нужно настроить

  • Хранение. Получит ли временно отключённый подписчик пропущенные события и как долго они будут доступны.

  • Повторы. Когда сообщение доставляется снова и как получатель распознаёт дубли.

  • Ошибки. Где разбирать сообщения, которые не удалось обработать.

  • Ограничения. Как медленный подписчик влияет на очереди, хранилище и общие ресурсы.

  • Порядок. Нужно ли обрабатывать события одного объекта последовательно.

Раздельные подписки помогают уменьшить взаимное влияние получателей. Полная изоляция сбоев зависит от реализации, лимитов и доступных ресурсов.

Публикация-подписка подходит, когда один факт нужен нескольким участникам. Для задания, которое должен выполнить один из доступных исполнителей, обычно выбирают канал «точка-точка».