Тугой хвост. Никаких сюрпризов на p99.
Безлоковые SPSC-очереди, декодеры тегов без ветвлений, инлайнинг горячего пути. Самое медленное сообщение выглядит как самое быстрое. Именно это площадки оценивают на самом деле.
Движок протокола FIX на C++23, созданный для площадок, не прощающих пропущенный heartbeat. Ноль выделений на горячем пути, парсинг за доли микросекунды, детерминированное состояние сессии.
Предсказуемо. До самой глубины.
Каждое число, к которому вы бы обратились в продакшен-руководстве. Замерено под нагрузкой, на типовом железе, против детерминированного повтора.
Три архитектурных решения, которые усиливают друг друга. Каждое делает возможным следующее.
Безлоковые SPSC-очереди, декодеры тегов без ветвлений, инлайнинг горячего пути. Самое медленное сообщение выглядит как самое быстрое. Именно это площадки оценивают на самом деле.
Статические arena, интрузивные free-list, слоты сообщений фиксированного размера. Аллокатор не запускается, пока идут ордера. Поэтому ядро никогда не вытесняет вас, чтобы вернуть страницу.
Словари, сгенерированные под каждую версию, выбираемые в рантайме на уровне сессии. Кастомные оверлеи диалектов для специфичных полей площадок. Формат на проводе, который использует площадка, — это формат, который отправляете вы.
Предсобранные профили сессий для основных площадок акций, фьючерсов, FX и крипты. Heartbeat, семантика sequence-reset и особенности resend-request, извлечённые из реальных продакшен-трейсов.
Один NewOrderSingle, декодирование и маршрутизация, бок о бок. То же сообщение, та же машина, совсем другая цена.
void Application::onMessage(const FIX44::NewOrderSingle& msg, const SessionID& sid) { FIX::ClOrdID clOrdId; msg.get(clOrdId); // allocates FIX::Symbol symbol; msg.get(symbol); // allocates FIX::Side side; msg.get(side); FIX::OrderQty qty; msg.get(qty); // allocates Decimal FIX::Price price; msg.get(price); // allocates Decimal std::string key = symbol.getString(); // allocates std::string router_->route(key, clOrdId.getString(), qty, price); } // ~14 heap allocs / msg
void OrderHandler::on_message(MessageView m, SessionRef sid) noexcept { auto [cl_ord_id, symbol, side, qty, price] = m.decode<D::ClOrdID, D::Symbol, D::Side, D::OrderQty, D::Price>(); // in-place, span<const char> // fixed-arena order slot, no heap, no copies auto& slot = arena_.acquire(cl_ord_id); slot.init(symbol, side, qty, price, sid); router_.route(slot); // 0 heap allocs / msg }
QuickFIX два десятка лет выносил тяжёлую работу для индустрии. К NexusFIX обращаются, когда те решения стали узким местом.
| QuickFIX | NexusFIX | |
|---|---|---|
| Выделения памяти на горячем пути | ~14 выделений heap на сообщение (std::string, Decimal) | 0 · статические арены, декод на месте |
| Задержка парсинга p99 | 1,2–1,8 µs в зависимости от диалекта | < 500 ns · безветвящийся декод тегов |
| Пропускная способность / ядро | 60–90K msg/s устойчиво | 240K+ msg/s устойчиво |
| Поведение хвоста под нагрузкой | Без GC, но дрейф аллокатора = непредсказуемые всплески | Никакого аллокатора на горячем пути. плоский хвост |
| Версии протокола | 4.2 / 4.4 / 5.0. XML-словарь данных на сборку | 4.2 / 4.4 / 5.0 / FIXT + оверлей диалекта в рантайме |
| Язык | Идиомы C++03 / C++11, виртуальный диспатч | C++23, concepts + ranges, никаких virtual на горячем пути |
Байты с провода на вход. Маршрутизированный ордер на выход. Три стадии, все в одном потоке, все без выделений.
Поток, разделённый SOH, итерируется на месте. Каждый тег разрешается в типизированный вид над исходным буфером; числовые поля парсятся без ветвлений, оверлей диалекта применяется в момент бинда сессии.
Порядковые номера, окна heartbeat, семантика gap-fill, причуды resend-request. Обрабатывается сгенерированной state-машиной для каждого профиля площадки. Каждый переход журналируется в memory-mapped журнал.
Слот ордера из фиксированной арены захватывается, заполняется по ссылке и передаётся в ваше приложение через lock-free SPSC-очередь. Слот живёт до терминального состояния ордера, затем возвращается в арену.
Две нити, за которые можно потянуть дальше. Архитектурная статья или живой разговорный объяснитель.
Как NexusFIX использует статические арены, lock-free SPSC-очереди и сгенерированные state-машины, чтобы самое медленное сообщение выглядело как самое быстрое. С цифрами.
Читать разбор →Разговорный интерфейс к документации движка, словарям сообщений, профилям площадок и набору бенчмарков. Обучен на боевой кодовой базе, опирается на реальные заголовки.
Открыть чатбота →NexusFIX поставляется как одна статическая библиотека и симулятор CLI-сессии. Принесите конфигурацию площадки и обработчик, и локально работает детерминированная FIX-сессия. Воспроизводимая из журнала, прослеживаемая до байта.
NexusFIX — один из трёх движков, которые мы строим. Та же философия: open-source где возможно, производительность в первую очередь, никакого lock-in.
AI-генерация в масштабе + скорость бэктеста на C++23 + статистическая композиция институционального уровня. Трёхслойный конкурентный ров, делающий квант-торговлю с 1000+ сигналами доступной.
Узнать больше →Движок бэктестинга на C++23 со 138+ индикаторами и production-готовыми стратегиями. Слой воспроизведения под StratCraft, доступный отдельно для вашего собственного research-стека.
Узнать больше →