TGViewer
Java Portal | Программирование Java Portal | Программирование @java_iibrary · 11.6K subscribers
Post #1531 1.69K
Проектирование Backend-системы. Система уведомлений

Цель —> Разработать систему для доставки уведомлений пользователям через:

➣ Встроенные уведомления
➣ Push-уведомления (мобильные/веб)
➣ Email

С поддержкой:

✓Масштабируемости (миллионы пользователей)
✓Настраиваемых пользовательских предпочтений
✓Надежности, повторных попыток и дедупликации
✓Реального времени и пакетных оповещений

Пошаговый сквозной процесс

Шаг 1: Срабатывание события

✓ Приложение инициирует событие:

➣ Например, пользователь A лайкнул ваш пост
➣ Отправляется запрос POST на API /notify:

{
"event_type": "like",
"actor": "UserA",
"receiver": "UserB",
"object": "Post123"
}


Шаг 2: Добавление в очередь уведомлений

➣ API валидирует данные и помещает сообщение в очередь уведомлений (Kafka/RabbitMQ)

Шаг 3: Обработка воркером

✓ Воркер извлекает сообщение из очереди:

➣ Получает полную информацию о событии
➣ Обращается к сервису предпочтений:

- Подписан ли UserB на уведомления типа "like"?

- Хочет email или только in-app?

✓ Создает payload уведомления, например:

✓ "UserA лайкнул ваш пост 'How to scale systems'"

Шаг 4: Рассылка по каналам

✓ На основе предпочтений воркер запускает соответствующие каналы:

➣ In-App Writer → сохраняет в БД (для отображения иконки колокольчика)
➣ Push-сервис → отправляет push (мобильный/веб) через FCM/APNs
➣ Email-сервис → ставит email в очередь (через SES/SendGrid)

Шаг 5: Отправка и повторные попытки

✓ Сервисы каналов:

➣ Декуплированы для изоляции отказов
➣ Повторяют попытки при сбоях (3–5 раз с экспоненциальной задержкой)
➣ Логируют статус (отправлено, ошибка, пропущено)

Шаг 6: Отображение in-app уведомлений

✓ UI вызывает /notifications?user=UserB
✓ Возвращаются N последних уведомлений из БД:

[
{ "text": "UserA лайкнул ваш пост", "read": false, ... }
]


Функции надежности

✓ Гарантированная доставка хотя бы один раз с идемпотентной записью
✓ Повторные попытки с экспоненциальной задержкой
✓ DLQ (Dead Letter Queue) для сообщений с ошибками
✓ Метрики: успех/неудача на сообщение
✓ Алерты при переполнении очереди или всплесках ошибок

👉 Java Portal
  • ❤ 10
  • 👍 3
  • 🔥 3
More from @java_iibrary
  1. Oct 2, 2026Процесс ≠ Поток ≠ Виртуальный поток. Эти понятия часто путают, хотя они решают разные зада…
  2. Oct 1, 2026Когда Java-стектрейс оказался длиннее контекста ИИ 👀 👉 Java Portal
  3. Oct 1, 2026Spring Boot 4: приближение срока истечения SSL-сертификатов больше не меняет статус health…
  4. Sep 30, 2026Почему один и тот же Java-файл .class запускается на Windows, Linux и macOS без перекомпил…
  5. Sep 30, 2026Docker прост, пока всё работает. Но что делать, если контейнер постоянно перезапускается,…
  6. Sep 29, 2026Эволюция языков программирования 1940-е → Машинный код ⬇️ 1950-е → Ассемблер ⬇️ 1960-е → F…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →