Почему push-уведомления торгового бота приходят с задержкой
Задержка push-уведомлений торгового бота почти никогда не связана с «медленным интернетом». Уведомление проходит цепочку: событие на биржевом шлюзе → очередь сообщений → сервис рассылки → транспорт операционной системы → устройство. Разрыв или затор на любом участке даёт одно и то же: сигнал о сделке приходит, когда цена уже ушла, а иногда не приходит вовсе.
Самая частая причина — очередь сообщений. Если воркер разбирает её одним потоком, а поток событий в момент волатильности вырастает в десятки раз, сообщения копятся и доставляются пачкой с опозданием. Второй источник — фоновая доставка: iOS и Android усыпляют приложение и режут фоновые соединения, поэтому постоянный сокет не спасает, а агрессивная экономия заряда на устройстве может отложить доставку на минуты или заблокировать её до следующего открытия приложения.
Потеря уведомлений — отдельный класс. Транспорт не гарантирует доставку: если устройство офлайн, а срок жизни сообщения истёк, оно пропадает молча. Плюс смена токена при переустановке или обновлении — старая запись в базе подписок становится мёртвой, и часть пользователей перестаёт получать сигналы, не подозревая об этом.
Мы разбираем эту цепочку по участкам и закрываем узкие места: приоритетные каналы для критичных событий, дедупликация и подтверждение доставки, отдельный путь для алертов о сделках в обход общих рассылок. Дальше — как это устроено и что даёт на практике.
Что даёт отказоустойчивая доставка сигналов
Скорость доставки сигнала перестаёт быть лотереей: уведомление уходит в момент срабатывания условия, а не при следующем открытии приложения. На практике это разница между входом по цене и входом после движения — критичные секунды, которые в торговле решают исход сделки. Мы строим канал так, чтобы задержка оставалась предсказуемой при любой нагрузке на рынке, включая моменты резких всплесков волатильности, когда серверы бирж и операторы связи работают на пределе.
Пропущенные сигналы исчезают как класс: каждое срабатывание получает подтверждение доставки, а неподтверждённые ставятся в очередь на повтор. Если телефон в этот момент в зоне без сети или приложение выгружено системой, уведомление не теряется — оно дойдёт, как только канал восстановится, и пользователь увидит его с пометкой о времени срабатывания. Это принципиально отличает торгового бота от обычного мессенджера, где потерянное сообщение никого не тревожит.
Устойчивость канала обеспечивается дублированием маршрутов: основной канал, резервный и локальная проверка на стороне устройства. При обрыве связи система не молчит и не копит сигналы до бесконечности — она переключается на альтернативный маршрут и продолжает доставку, а пользователь видит актуальное состояние подключения. Надёжность уведомлений подтверждается метрикой доли доставленных сигналов: мы держим её на уровне, при котором единичные сбои не влияют на торговую логику.
Предсказуемое поведение при обрывах — отдельная задача. Мы проектируем так, чтобы при восстановлении связи пользователь получил не поток устаревших сигналов, а сводку с актуальными срабатываниями и понятной пометкой, какие из них уже отработаны. Это снимает риск ложных входов по «просроченным» уведомлениям и делает работу с ботом спокойной даже в нестабильной сети.
Способы доставки: сравнение вариантов интеграции
Способы доставки push-уведомлений торгового бота различаются не «скоростью» как таковой, а тем, где именно сигнал может застрять. Ниже — четыре реальных варианта интеграции, между которыми выбирают на старте, и их ограничения.
| Вариант | Когда подходит | Ограничения |
|---|---|---|
| Прямая отправка через сервис доставки (FCM/APNs) | Свой бэкенд уже формирует события сделки, нужен контроль над текстом и таргетингом | Нет гарантии порядка доставки; при агрессивном энергосбережении устройства сигнал может прийти с задержкой; требуется своя логика повторов и дедупликации |
| Через брокер сообщений (очередь + воркер-отправитель) | Высокая частота событий, несколько потребителей, нужна устойчивость к всплескам | Появляется промежуточное звено, которое само требует мониторинга; задержка растёт на время постановки и снятия из очереди |
| Вебхук от биржи/брокера напрямую в приложение | Простой сценарий, минимум инфраструктуры | Нет гарантии доставки на устройство, если приложение закрыто; легко теряются события при недоступности получателя |
| Локальный опрос (периодический запрос состояния) | Резервный канал, когда push недоступен | Задержка равна интервалу опроса; при частых запросах растёт расход батареи и трафика |
Ключевое ограничение push как канала — отсутствие гарантии доставки на уровне операционной системы. Поэтому в продакшене обычно комбинируют подходы: брокер держит события, сервис доставки отправляет их, а локальный опрос работает как страховка на случай, если сигнал не дошёл.
Выбор варианта интеграции определяется не «модностью» стека, а требованиями к задержке и цене потери события. Для торгового бота потеря одного уведомления о сделке — это пропущенный вход или выход, поэтому сравнение подходов стоит вести по критерию «что произойдёт, если сигнал не дойдёт», а не по средней скорости доставки.
Как мы выстраиваем доставку push-уведомлений торгового бота
Доставка push-уведомлений торгового бота — это не «подключить сервис рассылок», а спроектированный маршрут: от события в ядре торговли до экрана блокировки телефона. Ниже — как мы ведём такую работу, чтобы уведомление о срабатывании сигнала или исполнении заявки приходило за секунды, а не терялось по пути.
- Аудит текущей схемы. Смотрим, где рождается событие, через какие очереди и сервисы оно идёт, где стоит фильтрация по типу сигнала и как устроена авторизация устройства. Фиксируем узкие места: блокирующие вызовы в обработчике события, отсутствие разделения на критичные и информационные потоки, дубли при повторной доставке.
- Проектирование маршрута уведомлений. Разводим потоки по классам: срабатывание сигнала, исполнение заявки, изменение баланса, служебные сообщения. Для каждого класса определяем приоритет, срок жизни и поведение при недоступности устройства — критичные идут немедленно, информационные собираются в дайджест.
- Настройка доставки и приоритетов. Настраиваем каналы под обе платформы, отдельно — тихие часы и группировку, чтобы серия сигналов не превращалась в шквал. Прописываем правила повторной отправки и подтверждения получения, чтобы уведомление не терялось при обрыве связи.
- Проверка сценариев. Прогоняем реальные торговые ситуации: резкий рост волатильности, серия сигналов подряд, устройство в спящем режиме, смена сети, отзыв доступа. Смотрим не «пришло ли вообще», а через сколько и в правильном ли порядке.
- Обработка отказов. Проверяем, что происходит при недоставке: уходит ли событие в резервную очередь, видит ли пользователь пропущенное уведомление в приложении, не задваивается ли доставка при повторной попытке.
- Согласование порогов. Вместе с вами определяем, какие события критичны, а какие можно агрегировать — от этого зависит, будет ли бот полезным инструментом или источником раздражения.
- Передача и наблюдение. Отдаём настроенную схему, правила маршрутизации и метрики доставки: доля успешных, среднее время, число повторов. Дальше отслеживаем эти показатели, чтобы деградация была видна до жалоб пользователей.
Опишите вашу торговую логику и текущую схему уведомлений — вернёмся с оценкой и планом работ по этапам.
Конфигурации, схемы и регламенты на выходе
Проект закрывается не презентацией, а набором артефактов, по которым приложение живёт и развивается без автора. Ниже — что именно остаётся у вас в репозитории и в системе мониторинга после сдачи push-контура торгового бота.
- Конфигурации каналов доставки: параметры подключения к сервисам уведомлений, разделение на транзакционные и маркетинговые потоки, шаблоны сообщений с переменными и правила их валидации перед отправкой.
- Схемы маршрутизации: логика выбора канала под тип события (сработавший ордер, изменение цены, статус заявки), правила отката на резервный канал при недоставке и таймауты повторных попыток.
- Политики приоритетов: очередность обработки событий, ограничения частоты на пользователя, окна тишины и правила подавления дублей — чтобы серия сработавших сигналов не превращалась в шквал.
- Регламенты эксплуатации: порядок действий при деградации канала, критерии переключения на резерв, чек-лист проверки после инцидента и точки контроля метрик доставки.
- Документация по интеграции: описание контрактов между торговым ядром и сервисом уведомлений, форматы событий, требования к идемпотентности и поведение при повторной доставке.
- Дашборды и алерты: набор метрик по времени доставки, доле успешных отправок и отказам по каналам, с порогами, при которых дежурный получает сигнал до того, как о проблеме узнают пользователи.
- Инструкция по локальному воспроизведению: как поднять тестовый контур, прогнать сценарии доставки и отказов, проверить новые шаблоны без риска для боевого потока.
Каждый артефакт версионируется вместе с кодом, поэтому изменения в маршрутизации и приоритетах проходят ревью и откатываются так же, как обычный релиз. Опишите ваш сценарий — вернёмся с оценкой и планом, какие из этих документов нужны именно вам.
Кейс: как мы сократили задержку сигналов в 4 раза
Клиент — сервис автоматической торговли: сигнал генерируется на стороне брокера, уходит в наш бэкенд и должен дойти до трейдера раньше, чем изменится котировка. На старте сигналы формировались на сервере, а мобильное приложение забирало их опросом по расписанию. При активном рынке опрос не успевал за потоком событий: часть уведомлений приходила с задержкой, часть — уже неактуальной, и трейдер видел вход, когда цена ушла.
Мы сняли метрики до изменений: средняя задержка доставки сигнала — около 12 секунд, на пиковых нагрузках — до 40. Доля сигналов, доставленных позже 5 секунд, держалась на уровне 18%. Отдельно считали долю потерянных уведомлений — система не различала, дошло ли сообщение до устройства или осталось в очереди.
Firebase Cloud Messaging мы подключили как основной канал доставки, оставив опрос только как резервный сценарий. Сигнал теперь публикуется в шину событий, оттуда уходит в сервис рассылки и доставляется пушем на устройство. Приоритет сообщения выставлен высокий, чтобы система не откладывала доставку при экономии заряда, а на клиенте добавлена дедупликация — повторный пуш по тому же сигналу не создаёт второй алерт.
Мониторинг перестроили вокруг сквозной трассировки: у каждого сигнала есть идентификатор, по которому видно время генерации, постановки в очередь, отправки и подтверждения получения на устройстве. Это дало не только цифры, но и понимание, на каком участке теряются секунды.
| Метрика | До | После |
|---|---|---|
| Средняя задержка доставки | ~12 с | ~3 с |
| Задержка на пике | до 40 с | до 9 с |
| Доля сигналов позже 5 с | 18% | 4% |
| Потерянные уведомления | не отслеживались | <0,5% |
Задержку сократили в 4 раза, а доля поздних сигналов упала более чем вчетверо. Трейдер получает сигнал, пока он ещё торгуемый, а команда видит деградацию доставки по графику, а не по жалобам.
Чем отличается push-уведомление от in-app сообщения?
Push-уведомление уходит через системный сервис операционной системы и всплывает на заблокированном экране, когда приложение закрыто или выгружено из памяти. In-app сообщение живёт внутри активной сессии: оно рисуется поверх текущего экрана и существует, только пока пользователь держит приложение открытым. Для торгового бота это два разных класса доставки — первый догоняет владельца в любой момент, второй работает как уточнение к тому, что уже происходит на экране.
Разница проявляется в надёжности и задержке. Системный канал не гарантирует мгновенную доставку: устройство может быть в спящем режиме, в зоне без сети или под агрессивной экономией заряда, и тогда сигнал приходит с задержкой или схлопывается в один. Внутри активной сессии сообщение доставляется сразу по постоянному соединению, но только если приложение на переднем плане. Поэтому критичные события — срабатывание условия, исполнение заявки, стоп-лосс — отправляем системным уведомлением, а детали и подтверждения показываем in-app, когда пользователь уже в приложении.
Выбор канала — это не «или-или», а маршрутизация по состоянию клиента. Сервер знает, активна ли сессия: если да, сигнал идёт по быстрому пути и не дублируется баннером; если нет — уходит системное уведомление с высоким приоритетом. Так пользователь не получает два сообщения об одном событии и не пропускает важное из-за того, что приложение свёрнуто.
Дополняют друг друга они и по содержанию. Системное уведомление несёт минимум: что сработало и на каком инструменте, — этого достаточно, чтобы человек открыл приложение. Развёрнутый контекст — график, объём, причина срабатывания — отдаём in-app, где есть место и экран. Такое разделение снижает шум: короткий сигнал не перегружен, а полная картина ждёт внутри.
Отдельно решаем, что делать при недоставке. Если системный канал молчит дольше заданного порога, бот повторяет сигнал и помечает событие как неподтверждённое — при следующем входе пользователь видит его в ленте in-app. Это страхует от потери сигнала в момент, когда телефон был offline, и закрывает главный риск торгового бота: пропущенное срабатывание.
Технические сомнения и ответы инженеров
Push-доставка в торговом боте ломается не на сервере, а на стороне устройства: агрессивная экономия заряда, слабая связь, несколько активных устройств и вопросы безопасности всплывают уже на этапе эксплуатации. Ниже — разбор частых технических сомнений, с которыми к нам приходят команды после первых релизов.
Как ведут себя уведомления при слабой связи и обрывах сети?
Очередь на клиенте сохраняет события до восстановления канала, а доставка идёт по нарастающей паузе между попытками — устройство не бомбит сервер запросами и не теряет сигнал при переключении между сетями. Каждое уведомление получает идентификатор, поэтому повторная отправка не создаёт дублей: клиент отбрасывает уже показанные события. При возврате связи приходит не весь накопленный поток, а актуальное состояние — по ордеру видно текущий статус, а не устаревшую цепочку.
Почему система экономии заряда «убивает» уведомления и как это обходится?
Ограничения фоновой работы отсекают часть каналов доставки, поэтому мы не полагаемся на один путь. Критичные события идут через служебный канал, который система не сворачивает, а обычные — через штатный. Для торговых сигналов это значит: срабатывание по цене или стопу приходит даже при жёсткой экономии, а информационные сводки могут подождать. Настройки энергосбережения на конкретных моделях мы проверяем отдельно — это часть приёмки, а не сюрприз после запуска.
Что происходит, если пользователь вошёл с нескольких устройств?
Каждое устройство регистрируется как отдельный получатель со своим ключом, а привязка идёт к аккаунту, а не к телефону. Пользователь видит список активных устройств и может отозвать любое — токен отзывается на сервере, и доставка на него прекращается сразу. Если сработал торговый сигнал, уведомление уходит на все активные устройства, но действие по нему фиксируется один раз: повторное подтверждение с другого телефона не создаёт вторую сделку.
Насколько безопасна передача торговых данных в уведомлениях?
В тексте уведомления нет чувствительных данных — только идентификатор события и краткий статус, остальное клиент запрашивает по защищённому каналу после аутентификации. Токены устройств хранятся в защищённом хранилище и отзываются при выходе из аккаунта или смене пароля. Это закрывает основной риск: перехваченное уведомление не даёт доступа к счёту и не раскрывает позиции.
Если у вас остались сомнения по конкретному сценарию — опишите задачу, вернёмся с оценкой и планом.
Обсудим вашу задачу и вернёмся с планом
Чтобы вернуться с оценкой, а не с общими словами, нам нужно понять вашу текущую схему доставки уведомлений. Опишите, как сигнал от торгового бота сейчас попадает на устройство: через собственный сервер, сторонний сервис или напрямую из бэкенда биржи, и что происходит при всплеске рыночной активности. Этого достаточно, чтобы предложить решение и план работ.
Что полезно приложить к описанию задачи:
- текущий путь сигнала: от генерации до экрана телефона, с указанием всех промежуточных звеньев;
- как обрабатываются всплески: что происходит при резком росте числа сделок и одновременных оповещений;
- поведение на iOS и Android: есть ли расхождения по задержке и доставке в фоне;
- что уже пробовали: очереди, приоритеты, группировка, ограничение частоты;
- требования к надёжности: критично ли получить сигнал при слабой сети и после перезапуска приложения;
- доступы и ограничения: какие сервисы уже используются и есть ли привязка к конкретному поставщику;
- сроки и ожидания по нагрузке: сколько пользователей и сигналов в пике вы закладываете.
Дальше мы разберём узкие места, предложим архитектуру доставки и вернёмся с оценкой по этапам: что делаем первым, что можно отложить, где потребуется миграция. Следующий шаг — короткий разговор по вашей схеме, после которого вы получите план работ с приоритетами и понятными сроками. Обсудим задачу — опишите текущее устройство в двух абзацах, и мы вернёмся с решением.







