Чем Pub/Sub отличается от Observer?
Поведенческие паттерны
В Observer подписчик регистрируется прямо у субъекта и обычно вызывается им синхронно; в Pub/Sub между издателем и подписчиками стоит брокер (шина, канал), и стороны знают только имя топика, а не друг друга.
Различия
- Связанность: подписчик Observer держит ссылку на субъект; в Pub/Sub обе стороны зависят только от брокера и формата сообщения.
- Доставка: Observer — вызов функций в том же процессе; Pub/Sub — часто асинхронно и между процессами.
- Фильтрация: у Observer подписка на объект целиком или на событие; в Pub/Sub — по топику, шаблону (
orders.*) или содержимому. - Примеры: Observer —
addEventListener, RxJS Subject, MobX; Pub/Sub — Redis Pub/Sub, NATS, Kafka, Google Cloud Pub/Sub, шина событий внутри приложения.
Что даёт брокер
- Развязку во времени и пространстве: издатель не ждёт подписчиков, те могут жить в других сервисах.
- Масштабирование: consumer group в Kafka делит партиции топика между экземплярами.
- Гарантии задаёт брокер: Redis Pub/Sub — at-most-once, отключённый подписчик сообщение теряет; Kafka хранит лог и позволяет перечитать его с нужного offset.
Цена
- Неочевидно, кто подписан на
order.created— это знает только брокер или документация. - Асинхронность приносит вопросы порядка, дублей и идемпотентности обработчиков.
- Лишний компонент инфраструктуры, который надо мониторить.
Коротко для собеседования
Observer связывает подписчика с конкретным субъектом и обычно вызывает его синхронно, а в Pub/Sub стороны общаются через брокер по имени топика. Брокер даёт развязку и масштабирование, но добавляет асинхронность: нужны идемпотентные обработчики и понимание гарантий доставки.