Один надёжный поток цен из множества ненадёжных источников
Данные криптовалютного рынка разрознены. У каждого провайдера своя задержка, свои лимиты запросов и свои цены, и ни один из доступных по бюджету не давал этому финтех-стартапу (под NDA) того, что ему было нужно: дашбордов, которые обновляются примерно каждые 15 секунд. Публичные API, до которых можно было дотянуться, обновлялись раз в 30–40 секунд, да и то нестабильно.
Мы работали в full-stack-команде из трёх человек, которая за пять месяцев довела агрегатор данных криптовалютного рынка от MVP до продакшена.
Ключевые возможности
- Смещённый опрос нескольких провайдеров: каждый провайдер опрашивается по собственному графику со сдвигом, поэтому запросы распределяются во времени, а не упираются в лимиты все разом.
- Дедупликация и согласование тиков: повторяющиеся и противоречащие друг другу ценовые тики сводятся в единый источник истины.
- Взвешенный выбор провайдеров: у провайдеров есть веса, поэтому, решая, каким данным доверять, агрегатор отдаёт предпочтение более надёжным источникам.
- Автоматическое переключение на резервные фиды: когда один источник деградирует, данные продолжают поступать от остальных.
- Сводные обновления примерно каждые 15 секунд: кэшированный в Redis фид обновляется с циклом около 15 секунд.
- Доставка по WebSocket: дашборды получают новые цены сразу после публикации, не опрашивая сервер.
- Расписание с учётом затрат: графики опроса настроены так, чтобы платных вызовов API было как можно меньше.
Архитектура и технологический стек
Слой агрегации на Laravel и PostgreSQL
Агрегатор — приложение на Laravel с базой PostgreSQL. Задачи опроса по расписанию собирают цены у каждого провайдера и передают тики на согласование. Провайдеры отвечают с разной скоростью, поэтому логика согласования рассчитана на запоздавшие данные, а не предполагает, что все источники отчитываются в один и тот же момент.
Кэш Redis и фид по WebSocket
Согласованные цены записываются в Redis, который и служит сводным фидом. Дашборды читают из этого кэша и никогда не обращаются к провайдерам напрямую, поэтому рост трафика на дашбордах не означает роста платных вызовов API. Новые цены доходят до фронтенда по WebSocket, и дашборды остаются живыми.
Страницы на Inertia.js и Docker
Страницы для пользователей построены на Inertia.js, а там, где важна видимость в поиске, используется серверный рендеринг. Вся система контейнеризирована в Docker, поэтому деплои воспроизводимы.
Надёжность и контроль затрат
Самые сложные задачи здесь были эксплуатационными:
- Разброс задержек: согласование сглаживает разницу между быстрыми и медленными провайдерами, поэтому один медленный источник не тормозит весь фид.
- Лимиты запросов и стоимость данных: смещённый опрос и кэширование держат объём запросов в пределах лимитов каждого провайдера и снижают расходы на внешние API.
- Сбои провайдеров: благодаря взвешенному выбору и резервным фидам потеря одного провайдера лишь уменьшает число источников за фидом, а не роняет продукт.
Смежные работы
«ИИ-платформа аналитики криптовалют» добавляет к рыночным данным анализ тональности и выявление скама. Finkonkurs — портал с ценами на криптовалюты, рынками и новостями. Такие продукты с большими объёмами данных мы создаём в рамках услуги по разработке веб-приложений.



