Цель —> Разработать систему для доставки уведомлений пользователям через:
➣ Встроенные уведомления
➣ Push-уведомления (мобильные/веб)
С поддержкой:
✓Масштабируемости (миллионы пользователей)
✓Настраиваемых пользовательских предпочтений
✓Надежности, повторных попыток и дедупликации
✓Реального времени и пакетных оповещений
Пошаговый сквозной процесс
Шаг 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
