Движок протокола FIX · v1.8 · Май 2026

NexusFIX.
Движок, который никогда не выделяет память.

Движок протокола FIX на C++23, созданный для площадок, не прощающих пропущенный heartbeat. Ноль выделений на горячем пути, парсинг за доли микросекунды, детерминированное состояние сессии.
Предсказуемо. До самой глубины.

nexusfix / session / XCME.PROD.42
C++23 · 0 ALLOC · 247K msg/s

Поток сообщений · XCME.PROD.42 · NewOrderSingle ⇄ ExecutionReport

tail -f · live stream
12:04:18.11435=D|49=NEXFIX|56=XCME|34=184221|11=ord-9f2e|55=ESM6|54=1|38=2|40=2|44=5418.25parsed 318 ns
12:04:18.11435=8|49=XCME|56=NEXFIX|34=184222|11=ord-9f2e|17=exec-1|150=0|39=0|55=ESM6|54=1acked 1.2 µs
12:04:18.47135=8|49=XCME|56=NEXFIX|34=184223|11=ord-9f2e|17=exec-2|150=F|39=2|32=2|31=5418.25parsed 296 ns
12:04:19.00035=0 heartbeat|34=184224|49=NEXFIX|56=XCME · 30s intervalsent 84 ns
12:04:19.21435=D|49=NEXFIX|56=XCME|34=184225|11=ord-9f2f|55=NQM6|54=2|38=1|40=2|44=19842.75parsed 304 ns
12:04:19.21535=8|49=XCME|56=NEXFIX|34=184226|11=ord-9f2f|17=exec-3|150=0|39=0acked 1.1 µs
12:04:19.60135=8|49=XCME|56=NEXFIX|34=184227|11=ord-9f2f|17=exec-4|150=F|39=2|32=1|31=19842.50parsed 311 ns
12:04:19.88035=F CancelRequest|34=184228|41=ord-9f2e|11=cxl-7a01|55=ESM6parsed 292 ns
12:04:19.88135=8|49=XCME|56=NEXFIX|34=184229|11=cxl-7a01|17=exec-5|150=4|39=4 · cancelledacked 1.0 µs
247K/s
пропускная способность
0
выделения в куче на горячем пути
412ns
задержка парсинга p99
3.4×
против базы QuickFIX

Бюджет производительности.

Каждое число, к которому вы бы обратились в продакшен-руководстве. Замерено под нагрузкой, на типовом железе, против детерминированного повтора.

Задержка парсинга
<500ns
p99, NewOrderSingle. Фиксированные буферы, итерация полей без копирования.
Пропускная способность
240K+ /s
На сессию, одно ядро. Линейное масштабирование между сессиями.
Выделения на горячем пути
0
Статические arena, кольцевые буферы заранее заданного размера, декодирование на месте.
против QuickFIX
3×
Быстрее end-to-end на той же нагрузке. Воспроизводимый набор бенчмарков.

Почему операторы
выбирают NexusFIX.

Три архитектурных решения, которые усиливают друг друга. Каждое делает возможным следующее.

1 Слой 1 · Детерминизм

Тугой хвост. Никаких сюрпризов на p99.

Безлоковые SPSC-очереди, декодеры тегов без ветвлений, инлайнинг горячего пути. Самое медленное сообщение выглядит как самое быстрое. Именно это площадки оценивают на самом деле.

120nsp50 · 240nsp90 · 360nsp99 · 412nsp99.9 · 580ns
2 Слой 2 · Память

Ноль выделений на горячем пути.

Статические arena, интрузивные free-list, слоты сообщений фиксированного размера. Аллокатор не запускается, пока идут ордера. Поэтому ядро никогда не вытесняет вас, чтобы вернуть страницу.

QuickFIX /order-flow
выделения в куче / сообщ.~14
NexusFIX /order-flow
выделения в куче / сообщ.0 · переиспользование arena
3 Слой 3 · Протокол

FIX 4.2 / 4.4 / 5.0 / FIXT. Один движок.

Словари, сгенерированные под каждую версию, выбираемые в рантайме на уровне сессии. Кастомные оверлеи диалектов для специфичных полей площадок. Формат на проводе, который использует площадка, — это формат, который отправляете вы.

FIX 4.2полный
FIX 4.4полный
FIX 5.0 SP2полный
FIXT 1.1полный
Кастомоверлей
Боевая обкатка на линии

Настроен под площадки, на которых вы реально торгуете.

Предсобранные профили сессий для основных площадок акций, фьючерсов, FX и крипты. Heartbeat, семантика sequence-reset и особенности resend-request, извлечённые из реальных продакшен-трейсов.

CMEICENYSENasdaqLSEEurexHKEXSGXEBSRefinitivCoinbase PrimeBinance Inst.

Горячий путь,
двумя способами.

Один NewOrderSingle, декодирование и маршрутизация, бок о бок. То же сообщение, та же машина, совсем другая цена.

QuickFIX (C++) application.cpp
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
p99 парсинг + маршрут1.42 µs · 14 allocs
NexusFIX (C++23) order_handler.cpp
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
}
p99 парсинг + маршрут412 ns · 0 allocs

Почему команды заменяют QuickFIX.

QuickFIX два десятка лет выносил тяжёлую работу для индустрии. К NexusFIX обращаются, когда те решения стали узким местом.

QuickFIXNexusFIX
Выделения памяти на горячем пути~14 выделений heap на сообщение (std::string, Decimal)0 · статические арены, декод на месте
Задержка парсинга p991,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 на горячем пути
QuickFIX строился, когда 5 000 msg/sec считалось загруженной сессией. NexusFIX строится для площадок, где это «спокойная минута». и хвост всё равно должен оставаться плоским.

Горячий путь,
из конца в конец.

Байты с провода на вход. Маршрутизированный ордер на выход. Три стадии, все в одном потоке, все без выделений.

1 Стадия 1 · Декод

Байты внутрь, поля наружу. без копирования.

Поток, разделённый SOH, итерируется на месте. Каждый тег разрешается в типизированный вид над исходным буфером; числовые поля парсятся без ветвлений, оверлей диалекта применяется в момент бинда сессии.

span<const char>без ветвленийSIMD-контрольная сумма
2 Стадия 2 · Валидация

Состояние сессии, детерминированно.

Порядковые номера, окна heartbeat, семантика gap-fill, причуды resend-request. Обрабатывается сгенерированной state-машиной для каждого профиля площадки. Каждый переход журналируется в memory-mapped журнал.

seq-numheartbeatresendmmap journal
3 Стадия 3 · Маршрут

В ваш обработчик, без выделений.

Слот ордера из фиксированной арены захватывается, заполняется по ссылке и передаётся в ваше приложение через lock-free SPSC-очередь. Слот живёт до терминального состояния ордера, затем возвращается в арену.

SPSC-очередьслот ареныбез virtual

Идите глубже.

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

Подключите за полдня.

NexusFIX поставляется как одна статическая библиотека и симулятор CLI-сессии. Принесите конфигурацию площадки и обработчик, и локально работает детерминированная FIX-сессия. Воспроизводимая из журнала, прослеживаемая до байта.

Изучите другие проекты.

NexusFIX — один из трёх движков, которые мы строим. Та же философия: open-source где возможно, производительность в первую очередь, никакого lock-in.