В современном финтехе скорость, надежность и глубина предоставляемой информации особенно важны. За интуитивно понятным интерфейсом, который видит трейдер, скрывается сложная архитектура из взаимосвязанных сервисов, отвечающих за сбор, обработку и доставку рыночных данных в реальном времени. Мы — команда MarketData компании «Финам», в этой статье мы рассказываем, как устроена наша система изнутри.

Интерфейс пользователя: модульный конструктор для трейдера

Финансовый терминал — это не монолитное приложение, а набор независимых блоков-виджетов, которые пользователь может настраивать под свои задачи. Вот некоторые из модулей, которые видит трейдер:

  • список котировок: центральный блок, где отображаются выбранные инструменты (акции, облигации, фьючерсы) с текущей ценой, изменением за день и миниатюрным графиком для быстрой оценки тренда;

  • блок технического анализа: мощный инструмент для глубокого анализа. Позволяет строить детальные графики с историей торгов в различных масштабах — от минутных свечей до многолетних тенденций;

  • общая информация об инструменте: справочный блок с ключевыми данными: тип актива, капитализация, параметры обращения и другая фундаментальная информация;

  • ход торгов: статистика текущей торговой сессии: экстремумы (максимумы и минимумы), объемы сделок и другие ключевые метрики дня;

  • «стакан цен» (Order Book): окно в рыночную ликвидность. Показывает заявки всех участников рынка: покупателей (готовых купить по определенной цене) и продавцов (предлагающих свою цену). Это ключевой инструмент для оценки текущего настроения рынка;

  • портфель: персональный раздел трейдера. Здесь отображается текущее состояние счетов, список активов, средняя цена приобретения и история сделок.

https://trading.finam.ru/

Важная особенность — возможность кастомизации. Пользователь может создавать и сохранять несколько рабочих пространств (например, «Активная торговля» с десятком «стаканов» или «Долгосрочные инвестиции» с графиками и новостями), быстро переключаясь между ними.

Архитектура под капотом: команды и взаимодействие

За каждым элементом интерфейса стоит отдельная команда разработки, отвечающая за свой сегмент данных:

  • команда рыночных данных (MarketData): отвечает за доставку биржевых рыночных данных в реальном времени. Их главная задача — обеспечить минимальную задержку между появлением данных на бирже и их отображением в терминале клиента. Это критически важно для стаканов цен, где «вкусные» объемы могут быть разобраны за доли секунды;

  • команда технического анализа: обеспечивает работу графиков и исторических данных. Обрабатывает огромные массивы информации, позволяя строить и масштабировать графики за любой период;

  • команда торговой интеграции: управляет ядром терминала — процессом выставления и обработки заявок. Отвечает за скорость исполнения ордеров и доставку статусов по сделкам и портфелю;

  • команда справочной информации: решает нетривиальную задачу по сбору, версионированию и хранению фундаментальных данных по десяткам миллионов инструментов из множества внешних источников и вендоров. Также обрабатывает корпоративные события (сплиты, дивиденды, делистинг).

Фронтенд-приложение (веб- или мобильное) взаимодействует с этими бэкенд-командами по принципу «запрос-ответ или подписка». Внутри бэкенда команды также обмениваются данными: например, сервис технического анализа может запрашивать исторические данные, а торговой бэк использует актуальные биржевые данные и справочную информацию по бумагам и эмитентам.

Технологический стек: скорость и надежность

Для решения своих задач команды используют современный, но проверенный стек технологий.

  • Языки программирования: основная нагрузка лежит на C++ (стандарты 17/20) с использованием библиотек Boost и STL для максимальной производительности. Для новых сервисов активно применяется Rust как язык, обеспечивающий высокую скорость и безопасность памяти. Python используется для вспомогательных задач и скриптования.

  • Коммуникация: внутренним стандартом обмена данными является система удалённого вызова процедур (RPC) с открытым исходным кодом, разработанная в Google в 2015 году. Это позволяет добиться высокой скорости и эффективности передачи данных между сервисами.

  • Шина данных: Apache Kafka используется как центральная шина для асинхронного обмена сообщениями.

  • Инфраструктура: HashiCorp Consul применяется для service discovery, чтобы сервисы динамически находили друг друга без привязки к IP-адресам. Мониторинг и алертинг построены на Prometheus и Grafana.

  • Вендорские интеграции: одна из ключевых сложностей — работа с протоколами внешних поставщиков данных (биржи, данные). Команды разрабатывают адаптеры, которые преобразуют нативные, зачастую уникальные протоколы вендоров в единый внутренний стандарт. Это позволяет изолировать сложность и работать внутри системы с согласованным форматом данных.

Главные вызовы и как мы их решаем

Работа в режиме реального времени с финансовыми данными накладывает уникальные требования:

Скорость обработки данных. Необходимо обрабатывать десятки тысяч событий в секунду с минимальной задержкой.

Решение: использование высокопроизводительных языков (C++, Rust), эффективных бинарных протоколов (gRPC/Protobuf) и оптимизированных внутренних структур данных, минимизирующих блокировки (по аналогии с паттерном Disruptor).

Огромные объемы данных. Система работает с данными по более чем 47,7 млн инструментов. В пиковые моменты (открытие/закрытие торговых сессий) нагрузка многократно возрастает.

Решение: Горизонтальное масштабирование сервисов, активное использование кэширования и построение отказоустойчивой архитектуры.

Отказоустойчивость и надежность: для финансового продукта простои недопустимы.

Решение: Все критические сервисы работают в режиме горячего резерва (N+1). Каждая нода рассчитана на двойную нагрузку на случай отказа соседа. Сквозной мониторинг времени доставки данных от вендора до клиента с помощью Prometheus и Grafana позволяет сразу выявлять и устранять узкие места.

Оптимизация трафика: активные биржи (например, криптовалютные) генерируют колоссальный трафик. Стоит задача найти баланс между скоростью доставки данных и стоимостью использования трансатлантических каналов связи.

Решение: Поиск компромиссов и внедрение алгоритмов сжатия и оптимизации передачи данных.

Взгляд в будущее: планы развития

Архитектура постоянно развивается. Среди ключевых задач на ближайшую перспективу:

  • упрощение архитектуры: активное внедрение Apache Kafka как единой шины данных для всех сервисов. Это позволит упростить взаимодействие между командами, повысить надежность и упростить процедуры восстановления после сбоев;

  • повышение эффективности: постоянная работа над оптимизацией потребления памяти и производительности сервисов, особенно в свете растущего количества инструментов и запросов;

  • готовность к любым сценариям: разработка и отработка планов аварийного восстановления (Disaster Recovery), позволяющих развернуть всю систему с нуля в кратчайшие сроки.

За внешней простотой финансового терминала скрывается сложный и высоконагруженный организм. Бесперебойная работа этого механизма обеспечивается слаженной работой команд, современными технологиями и постоянной работой над выявлением и преодолением новых вызовов.

Хочешь решать такие же интересные задачи? Загляни на наш сайт, чтобы узнать больше о компании и открытых позициях в IT-департаменте «Финама». Мы всегда рады талантливым разработчикам, которым интересны сложные задачи и работа в финтехе.