Skip to content

← Notifications | Главная

Data Flow: Notifications

Жизненный цикл сообщения

  1. Сборка — код приложения создаёт NotificationPayloadDTO с получателем, темой, именем шаблона и контекстными данными.

  2. РендерингNotificationRenderer загружает Jinja2-шаблон, подставляет контекст и заполняет поля html_content / text_content в DTO.

  3. Постановка в очередь — вызывается NotificationAdapter.enqueue() с сериализованным DTO:

  4. ArqDeliveryAdapter помещает задачу в Redis-очередь через ARQ.
  5. DirectDeliveryAdapter немедленно вызывает оркестратор в текущем процессе.

  6. ОркестрацияBaseDeliveryOrchestrator.deliver() перебирает зарегистрированные каналы:

  7. Пропускает каналы, где is_available() возвращает False.
  8. Вызывает channel.send(to, subject, html, text).
  9. При успехе → возвращает True, останавливает перебор.
  10. При исключении → логирует, переходит к следующему каналу.
  11. Если все каналы исчерпаны → логирует ошибку, возвращает False.

  12. Подтверждение — при доставке через ARQ воркер отмечает задачу выполненной. Для прямой доставки подтверждение не требуется.

Диаграмма последовательности

sequenceDiagram
    participant App as Приложение
    participant Renderer
    participant Adapter
    participant Queue as Redis Queue
    participant Worker as ARQ Worker
    participant Orchestrator
    participant Channel as DeliveryChannel

    App->>Renderer: render(payload_dto)
    Renderer-->>App: payload_dto (с html/text)
    App->>Adapter: enqueue(task_name, payload)
    Adapter->>Queue: RPUSH job
    Queue-->>Worker: dequeue job
    Worker->>Orchestrator: deliver(payload_dto)
    loop каналы по порядку
        Orchestrator->>Channel: is_available()?
        Orchestrator->>Channel: send(to, subject, html, text)
        Channel-->>Orchestrator: True / False / Exception
    end
    Orchestrator-->>Worker: True (первый успех)

Пути ошибок

Точка отказа Поведение
Renderer бросает исключение Проброс к вызывающему — полезная нагрузка никогда не ставится в очередь
Adapter бросает исключение Проброс к вызывающему — инфраструктурная ошибка, нельзя замалчивать
Channel бросает исключение Логируется, следующий канал
Все каналы исчерпаны deliver() возвращает False, логируется как ошибка