Разговорный интерфейс к архитектуре NexusFIX, словарям сообщений, профилям площадок и набору бенчмарков. 182 экспертных ответа проиндексированы и привязаны к живой кодовой базе. А также живой тред, когда шаблонного ответа недостаточно.
Привет, я эксперт NexusFIX, основан на публичном исходном коде, CSV бенчмарков и 182 отобранных ответах, проиндексированных на этой странице.
Выберите тред справа или задайте любой вопрос ниже. Если ответа нет в исходниках, я об этом скажу.
Как NexusFIX достигает нулевых аллокаций в куче?
Три замены, все на горячем пути:
1. Представления std::span<const char> в исходный буфер заменяют копии std::string. Span занимает 16 байт в стеке. Без кучи, без копирования, без деструктора.
2. Предварительно индексированный массив заменяет std::map для поиска полей. Доступ к полю становится единственным mov, индексированным по номеру FIX-тега.
3. std::pmr::monotonic_buffer_resource предоставляет арена-аллокацию для всего, что действительно требует слота. Арена предварительно выделена и переиспользуется на сессию.
Результат: 0 вызовов malloc на горячем пути, проверено пользовательским аллокатором, который инструментирует каждый alloc/free и проваливает тест при срабатывании любого.
Восемь вопросов, которые встречаются почти в каждом разговоре. Кликните для раскрытия. Или верните в живой тред выше.
QuickFIX был разработан в начале 2000-х вокруг идиом C++98/03: виртуальная диспетчеризация, аллокация в куче на каждое сообщение, хранение полей на основе строк. Эти паттерны принципиально несовместимы с задержкой ниже микросекунды.
Мы начали с первых принципов, используя возможности C++23, которых не существовало при проектировании QuickFIX. Std::span, std::expected, std::pmr, концепты и consteval. И спросили: как выглядел бы FIX-движок, если бы не тащить за собой двадцать лет решений по аллокаторам?
Квант-трейдинговые фирмы и команды инфраструктуры, которым нужна детерминированная обработка FIX-сообщений ниже микросекунды.
Конкретно: фирмы, запускающие коллокированные стратегии, команды, создающие собственные торговые шлюзы, и C++-инженеры, изучающие современные техники производительности на реальном публичном кодовом базе.
Представления std::span
Результат: ноль вызовов malloc на горячем пути, проверено через каркас инструментации пользовательского аллокатора, который запускается на каждой сборке CI.
std::expected для обработки ошибок (без исключений на горячем пути), std::span для представлений данных без копирования, концепты для проверки интерфейсов во время компиляции, consteval для вычислений во время компиляции и хинты ветвлений [[likely]]/[[unlikely]].
Каждая из них потребовала бы собственной ручной реализации в эпоху QuickFIX.
Инструкции AVX2 загружают 32 байта за раз и используют векторизованное сравнение для параллельного поиска разделителей SOH (\x01). Это примерно в 13 раз быстрее побайтового сканирования.
Техника вдохновлена simdjson, но адаптирована под семантику протокола FIX. То есть структура tag=value=SOH означает, что мы можем определить границы каждого поля за один векторизованный проход и затем построить таблицу смещений.
FIX 4.4 поддерживается полностью и является наиболее распространённой в продакшене. FIX 5.0 + FIXT 1.1 также поддерживается полностью, с накладными расходами всего 2% по сравнению с 4.4.
Структурный индекс не зависит от версии. Сканирование полей работает одинаково между версиями FIX. Пользовательские диалектные оверлеи обрабатывают специфичные для площадки теги при привязке сессии.
NexusFIX находится в активной разработке и пока не развёрнут в продакшен-средах торговли. Бенчмарки взяты из контролируемых сред с закреплением CPU и прогревом кеша.
Закалка продакшена. Стресс-тесты, покрытие режимов отказа, сертификация под конкретные шлюзы площадок. Это отдельная инженерная работа. Если вы рассматриваете его для продакшена, сначала свяжитесь с нами.
Fix8 (C++11) использует пулы объектов и техники нулевого копирования и является одним из более продвинутых открытых FIX-движков.
NexusFIX отличается тем, что использует функции стандартной библиотеки C++23 (PMR, std::span, std::expected) вместо пользовательских реализаций. Меньше подвижных частей для аудита. И добавляет SIMD-ускоренный парсинг, которого нет у Fix8.
Задайте его в живом треде выше. Или откройте issue на GitHub. Каждый вопрос с обоснованным и полезным ответом войдёт в индексированный набор в следующем релизе.