PassFront
  1. PassFront
  2. База знаний
  3. Поведенческие паттерны

Чем 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 стороны общаются через брокер по имени топика. Брокер даёт развязку и масштабирование, но добавляет асинхронность: нужны идемпотентные обработчики и понимание гарантий доставки.

Другие вопросы раздела