Кейс: система уведомлений

↑ 8.4 Backend System Design · ← Предыдущая · → Следующая

Обязательно~3 мин чтенияУровень: senior

Зачем это на собесе

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

Объяснение

Требования: отправка уведомлений по каналам (email, SMS, push, in-app), триггеры от событий и рассылки, шаблоны и локализация, предпочтения пользователя и «не беспокоить», доставка «хотя бы раз» без дублей для пользователя, приоритеты (2FA-код срочный, маркетинг — нет), статусы и аналитика.

flowchart LR
  E[Сервисы-источники] -->|события| KKafka: notifications
  K --> N[Notification Service]
  N --> P[(Предпочтения / шаблоны)]
  N --> Q1Очередь email
  N --> Q2Очередь SMS
  N --> Q3Очередь push
  Q1 --> W1[Воркер email] --> ESP[Провайдер]
  Q2 --> W2[Воркер SMS] --> SMS[Провайдер]
  W1 & W2 --> S[(Статусы доставки)]
  ESP -. вебхуки статусов .-> N

Ключевые решения:

ВопросРешение
Развязка источниковсобытия в Kafka, единый контракт NotificationRequested
Надёжностьoutbox у источника, at-least-once + дедупликация по notification_id
Повторыretry с backoff, DLQ; смена провайдера при сбое (failover)
Приоритетыотдельные очереди/топики и пулы воркеров
Ограничения провайдеровrate limiting на канал, батчинг
Шаблоныверсионируемые шаблоны + подстановка данных, локализация
Предпочтенияканалы, расписание, отказ от рассылки (обязательно для маркетинга)
Планировщикотложенные уведомления (delayed queue, планировщик)
Статусыsent/delivered/failed/opened, вебхуки провайдеров
Идемпотентностьключ на событие, чтобы не отправить дважды
Безопасностьне логировать содержимое (коды, персональные данные), защита от спама

Масштабирование: партиции по user_id, автоскейл воркеров по длине очереди.

Нюансы и подводные камни

  • Дубли пользователю неприемлемы (два SMS с кодом): дедупликация по идентификатору.
  • Провайдеры недоступны/ограничены: очередь и retry, мультипровайдерность.
  • Массовые рассылки не должны задерживать срочные: раздельные очереди.
  • Учитывайте часовые пояса и законодательство (согласия, отписка).
  • Порядок уведомлений важен не всегда: не платите за строгий порядок без нужды.

Практика

  1. Спроектируйте очереди и приоритеты для 2FA и маркетинга.
  2. Реализуйте дедупликацию и повторы с DLQ.
  3. Опишите метрики: доля доставки, задержка отправки, длина очередей.

Вопросы с ответами

Связанные темы