Signal — платформа телеметрии в реальном времени
Типизированный фронтенд-SDK и конвейер событий дали глобальным KYC-воронкам Binance видимость в реальном времени и сократили диагностику инцидентов с дней до минут.
- Роль
- Senior Frontend Engineer
- Период
- 2025–настоящее время
- Стек
- TypeScript · Mini Program · BFF · Kafka · Flink · ClickHouse · Grafana
Проблема
Миллионы людей в более чем 100 странах проходили проверку личности, и часть из них незаметно бросала её на полпути. Когда ломалась интеграция с поставщиком, этого никто не видел: разрозненные серверные логи читали вручную, и одна диагностика занимала от одного до трёх дней. Каждый такой день — это реальные пользователи, которые не смогли завершить онбординг.
Подход
- Небольшой типизированный SDK. Один трекер на TypeScript собирает одинаковые данные о действиях пользователя на каждом экране — в вебе, мобильном приложении и Mini Program, — поэтому события везде значат одно и то же.
- Троттлинг с предохранительным клапаном. SDK складывает события в очередь и отправляет их каждые 3 секунды или при накоплении 10 событий — что наступит раньше. Запрос на каждый клик истощает сетевые потоки браузера, а слишком долгое ожидание грозит потерей событий при закрытии вкладки. При уходе со страницы используется
navigator.sendBeacon. - BFF, который проверяет данные. Пакеты попадают в Backend for Frontend: он сверяет схему с определениями TypeScript, проверяет правдоподобность временных меток, удаляет неожиданные поля и персональные данные (PII) и добавляет метаданные сессии и решение бэкенда (пройдено, отклонено, ожидает проверки). Сравнение этого решения с тем, что показывал интерфейс, выявило расхождения состояния между UI и бэкендом.
- Kafka, Flink, ClickHouse, Grafana. Kafka принимает всплески мирового трафика, Flink обрабатывает события в реальном времени, ClickHouse их хранит (колоночное хранилище отвечает на агрегации по миллиардам событий с высокой кардинальностью за миллисекунды, а строчное едва ползёт), а Grafana показывает воронки.
- Тихая обработка сбоев. Если конвейер недоступен, SDK хранит до 100 событий в
localStorage, а пассивный предохранитель приостанавливает отправку. Он не опрашивает сервер о состоянии, а ждёт следующего успешного ответа.
Результат
Время обнаружения инцидента сократилось с 24–72 часов до менее чем 5 минут. Для воронки, где один сломанный шаг поставщика означает тысячи сорванных регистраций, это разница между строчкой в постмортеме и исправлением в то же утро.