
Всем привет, с вами Иванов Дмитрий, технический директор ВебРайз. В этом материале поговорим о сервисе доставки push-уведомлений — решаемых задачах, архитектуре, реализации и достигаемом эффекте.
Поставленная задача
Компания использует платные каналы (в первую очередь SMS) для оперативного информирования пользователей цифровых сервисов. SMS-информирование тарифицируется за каждое сообщение и формирует постоянную статью расходов, которая растёт вместе с активной базой пользователей.
Поставлена задача — снизить зависимость от платных каналов и реализовать собственный механизм доставки уведомлений, отвечающий следующим целям:
-
Сокращение затрат на SMS — перевести часть оперативных уведомлений на бесплатный по трафику канал;
-
Скорость информирования — доставлять сообщения пользователю практически мгновенно, без задержек операторских шлюзов;
-
Контроль и наблюдаемость — иметь единый инструмент управления подписками и отслеживания статусов доставки;
-
Технологическая основа — создать платформу, на которой в дальнейшем можно наращивать новые типы уведомлений.
Предложенное решение
В качестве решения выбрана доставка уведомлений по технологии Web Push для веб- и PWA-приложений. Это стандартный механизм, поддерживаемый современными браузерами, который позволяет отправлять сообщения пользователю даже когда вкладка приложения закрыта.
Что такое PWA и Web Push
PWA (Progressive Web App) — это веб-приложение, которое пользователь может установить на устройство как обычное приложение. Web Push — механизм, по которому такое приложение (или браузер) получает уведомления от сервиса. Ключевая особенность: доставка идёт через инфраструктуру браузерных вендоров и не тарифицируется пооператорно, в отличие от SMS.
Принцип работы в трёх шагах:
-
Пользователь заходит в приложение и разрешает получение уведомлений;
-
Приложение оформляет «подписку» — уникальный адрес доставки для этого устройства — и передаёт её в сервис;
-
Когда возникает событие, сервис отправляет уведомление по сохранённой подписке, и оно появляется у пользователя.
Что оборачивается в PWA
В PWA оборачивается личный кабинет клиента (ЛК) — существующее веб-приложение, которым пользователи уже пользуются в браузере. Отдельное нативное приложение под каждую платформу при этом не требуется: тот же ЛК становится устанавливаемым и получает возможность принимать push-уведомления.
Технически трансформация веб-приложения в PWA выполняется добавлением двух стандартных компонентов, без переписывания самого личного кабинета:
-
Манифест приложения. Файл с описанием приложения (имя, иконки, стартовый экран), благодаря которому браузер предлагает «установить» ЛК на устройство как отдельное приложение.
-
Service worker. Фоновый обработчик в браузере, который принимает push-уведомления и показывает их пользователю, даже когда вкладка ЛК закрыта.
После установки ЛК как PWA пользователь разрешает уведомления, приложение оформляет push-подписку и передаёт её в PushService. Дальнейшая доставка идёт по механизму, описанному ниже.
Примечание: Минимум изменений в ЛК
Оборачивание в PWA не затрагивает бизнес-логику личного кабинета — добавляются только манифест и service worker, а также клиентский код подписки на push. Существующий функционал ЛК продолжает работать как прежде, в том числе в обычном браузере без установки.
Почему это выгоднее SMS
|
Критерий |
SMS |
Web Push (PushService) |
|
Стоимость доставки |
Плата за каждое сообщение |
Бесплатно по трафику |
|
Скорость |
Зависит от оператора |
Практически мгновенно при стабильном интернете |
|
Состав сообщения |
Только текст |
Заголовок, текст, иконка, изображение, ссылка |
|
Обратная связь |
Ограниченная |
Статус доставки по каждому уведомлению |
|
Управление базой |
Внешние списки
|
Централизованный реестр подписок |
ВНИМАНИЕ. Важное ограничение охвата
Web Push доставляется только тем пользователям, кто установил приложение и разрешил уведомления. Push замещает не весь SMS-трафик, а его часть — по подписанным пользователям. SMS сохраняется как канал для неохваченной аудитории и критичных сообщений.
Как реализовано
Сервис PushService принимает уведомления от внешних систем, ставит их в очередь и асинхронно доставляет по активным подпискам получателя, фиксируя статус и при необходимости возвращая результат во внешнюю систему. Ниже приведена принципиальная схема работы.

Механизм доставки
-
Приём. Внешняя система отправляет уведомление; сервис проверяет права и обязательные поля, ставит его в очередь и сразу подтверждает приём.
-
Очередь. Принятые уведомления накапливаются в очереди доставки — это сглаживает пиковые нагрузки.
-
Воркер. Фоновый обработчик забирает уведомления из очереди и доставляет их по активным подпискам пользователей.
-
Фиксация статуса. По каждому уведомлению сохраняется результат: доставлено, ошибка, истёк срок или исчерпаны попытки.
ПРИМЕЧАНИЕ: Принято ≠ доставлено
Подтверждение приёма означает лишь, что уведомление поставлено в очередь. Итоговый результат становится известен после обработки воркером. Такое разделение — норма для систем массовой доставки: оно позволяет принимать большой поток запросов, не блокируя отправителя на время фактической доставки.
Виды рассылок
|
Вид рассылки |
Назначение |
Как инициируется |
|
Одиночная отправка |
Реакция на событие для одного пользователя (например, статус заявки) |
Внешняя система через Integration API |
|
Пакетная отправка |
Группа уведомлений за один запрос |
Внешняя система через Integration API |
|
Массовая отправка |
Разовая рассылка из файла Excel |
Через административный интерфейс |
Все виды рассылок проходят единый конвейер обработки (проверка → очередь → доставка → статус), что обеспечивает предсказуемое поведение независимо от способа отправки. Защита от дублей реализована через ключ идемпотентности: повторная отправка того же уведомления не создаёт дубликат.
Обратная связь: callbacks
Для интеграций, которым важно знать судьбу сообщения, предусмотрен механизм callback — передача результата доставки обратно во внешнюю систему по настроенному адресу. При временной недоступности приёмника выполняются повторные попытки по заданной политике (несколько попыток с нарастающими интервалами и таймаутом ответа).
СОВЕТ: Что это даёт бизнесу
Callback превращает push из «отправил и забыл» в контролируемый канал: система-источник получает подтверждение доставки и может строить на нём свою логику и отчётность (например, эскалировать в SMS, если push не доставлен).
Фоновая доставка и поведение на платформах
Возможность получать уведомления, когда приложение закрыто (в фоновом режиме), зависит от платформы устройства. Это следствие политик самих платформ, а не ограничение сервиса PushService — сервис одинаково формирует и отправляет уведомление во всех случаях, но конечное поведение определяется операционной системой и способом установки приложения.
Текущая картина по платформам:
-
Android (PWA). Уведомления доставляются полноценно, в том числе в фоновом режиме — когда приложение личного кабинета закрыто. Это основной сценарий, работающий штатно.
-
iOS (PWA). Уведомления доставляются полноценно, в том числе в фоновом режиме — когда PWA личного кабинета закрыта. Это основной сценарий, работающий штатно.
Безопасность и управление
-
Секретные данные подписок хранятся в зашифрованном виде и никогда не возвращаются в ответах и выгрузках.
-
Доступ разграничен по ролям и токенам: отдельные права на чтение реестра и на управляющие операции.
-
Административный интерфейс даёт единую точку контроля: состояние сервиса, реестр подписок, диагностика доставки, массовая отправка.
-
Отзыв подписки выполняется логически, без удаления записи — история сохраняется для аудита.
Детальная схема взаимодействия
Ниже приведена диаграмма последовательности, детализирующая внутреннюю работу сервиса при отправке уведомления: от приёма запроса и постановки задачи в очередь до отправки через шлюз, обработки успеха и ошибок с повторными попытками, приёма итогового статуса доставки (callback) и фиксации событий в системе логирования и мониторинга.

Ключевые моменты, которые иллюстрирует диаграмма:
-
Разделение приёма и доставки. После проверки и сохранения уведомления API сразу отвечает «принято в работу» (202), а фактическая отправка выполняется обработчиком задач асинхронно.
-
Обработка ошибок и повторы. При ошибке отправки статус фиксируется, и при наличии попыток задача ставится на повторную отправку; когда попытки исчерпаны — уведомление помечается как недоставленное.
-
Обратная связь по доставке. Итоговый статус доставки принимается через callback и обновляет запись уведомления (доставлено / не доставлено).
-
Наблюдаемость. На каждом значимом шаге событие фиксируется в подсистеме истории и мониторинга для последующего анализа.
Бизнес-результат
Внедрение PushService даёт прямой финансовый и несколько сопутствующих эффектов.
Экономия на SMS.
Прямая экономия рассчитывается как объём SMS-трафика, замещённого push-уведомлениями, умноженный на стоимость SMS.
|
Показатель |
Значение |
|
Объём SMS-информирования |
500 000 сообщений/мес |
|
Средняя стоимость SMS |
4 ₽ |
|
Текущий бюджет SMS-канала |
2 000 000 ₽/мес |
|
Доля трафика, замещаемая push |
50% (по подписанным пользователям) |
|
Ожидаемая экономия |
1 000 000 ₽/мес · 12 000 000 ₽/год |
ПРИМЕЧАНИЕ: Методика оценки
Реалистичная оценка строится «снизу»: берётся не весь SMS-трафик, а только та его доля, которая приходится на пользователей с активной push-подпиской. По мере роста числа подписок доля замещения — а значит и экономия — увеличивается. Для чистой экономии из валовой вычитается стоимость владения сервисом.
Сопутствующий эффект
|
Эффект |
В чём выражается |
|
Скорость информирования |
Мгновенная доставка без задержек операторских шлюзов |
|
Независимость от операторов |
Снижение зависимости от тарифов и доступности SMS-провайдеров |
|
Богатый формат |
Иконка, изображение, ссылка — выше вовлечённость по сравнению с текстом SMS |
|
Контроль доставки |
Статус по каждому уведомлению и обратная связь во внешние системы |
|
Поддержка PWA-сценариев |
Единый канал для веб- и установленных PWA-приложений |
|
Основа для развития |
Платформа для новых типов уведомлений без смены канала |
По вопросам, телеграм @webrise1
ссылка на оригинал статьи https://habr.com/ru/articles/1059890/