FIX 프로토콜 엔진 · v1.8 · 2026년 5월

NexusFIX.
결코 할당하지 않는 엔진.

하트비트 누락을 용납하지 않는 거래소를 위해 구축된 C++23 FIX 프로토콜 엔진. 핫 패스 제로 할당, 마이크로초 미만 파싱, 결정론적 세션 상태.
예측 가능. 구석구석까지.

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×
동일 워크로드에서 엔드투엔드 더 빠름. 재현 가능한 벤치마크 스위트.

운영자가
NexusFIX를 선택하는 이유.

서로 누적되는 세 가지 아키텍처 선택. 각각이 다음을 가능하게 만듭니다.

1 레이어 1 · 결정론

꽉 조여진 꼬리. p99에서 놀라움 없음.

락프리 SPSC 큐, 분기 없는 태그 디코더, 핫 패스 인라이닝. 가장 느린 메시지가 가장 빠른 것처럼 보입니다. 그것이 거래소가 실제로 평가하는 지표입니다.

120nsp50 · 240nsp90 · 360nsp99 · 412nsp99.9 · 580ns
2 레이어 2 · 메모리

제로 할당 핫 패스에서.

정적 arena, 침투형 프리리스트, 고정 크기 메시지 슬롯. 주문이 흐르는 동안 할당자는 실행되지 않습니다. 따라서 커널도 페이지 회수를 위해 선점하지 않습니다.

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, 암호화폐 거래소를 위한 사전 구축된 세션 프로파일. 실제 프로덕션 트레이스에서 포착한 하트비트, 시퀀스 리셋 시맨틱, 재전송 요청 특이점 포함.

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 는 20 년 동안 업계의 무거운 짐을 도맡아 왔습니다. 그 당시 선택이 병목이 될 때 NexusFIX 를 찾게 됩니다.

QuickFIXNexusFIX
핫 패스 할당메시지당 ~14 회 힙 할당 (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 없음
QuickFIX 가 만들어졌을 때 5,000 msg/sec 는 바쁜 세션이었습니다. NexusFIX 는 그것이 「조용한 1 분」인 거래소를 위해 만들어졌습니다. 그리고 어쨌든 테일은 평탄해야 합니다.

핫 패스를,
엔드-투-엔드로.

와이어 바이트가 들어오고, 라우팅된 주문이 나갑니다. 세 단계, 모두 같은 스레드에서, 모두 할당 없이.

1 스테이지 1 · 디코드

바이트가 들어오고, 필드가 나옵니다. 복사 없이.

SOH 구분 스트림이 제자리에서 순회됩니다. 각 태그는 원본 버퍼에 대한 타입드 뷰로 해석되고, 숫자 필드는 분기 없이 파싱되며, 방언 오버레이는 세션 바인드 시점에 적용됩니다.

span<const char>분기 없음SIMD 체크섬
2 스테이지 2 · 검증

세션 상태를, 결정적으로.

시퀀스 번호, 하트비트 윈도우, gap-fill 시맨틱, resend-request 의 변종들. venue 프로파일마다 생성된 상태 머신이 처리하며, 모든 전이가 memory-mapped 저널에 기록됩니다.

seq-num하트비트재전송mmap journal
3 스테이지 3 · 라우트

여러분의 핸들러로, 제로 할당으로.

고정 아레나의 오더 슬롯을 획득하고, 참조로 채운 뒤, 락프리 SPSC 큐를 통해 애플리케이션으로 전달합니다. 슬롯은 주문이 종료 상태에 이를 때까지 살아 있다가 아레나로 반환됩니다.

SPSC 큐아레나 슬롯virtual 없음

깊이.

다음에 당겨볼 두 가지 줄. 아키텍처 심층 글, 또는 라이브 대화형 설명자.

한 오후면 연결 끝.

NexusFIX 는 단일 정적 라이브러리와 CLI 세션 시뮬레이터로 배포됩니다. venue 설정과 핸들러를 가져오면, 로컬에서 결정적인 FIX 세션이 돌아갑니다. 저널에서 재생 가능하고, 바이트까지 추적 가능합니다.

다른 프로젝트 둘러보기.

NexusFIX 는 우리가 만드는 세 가지 엔진 중 하나입니다. 같은 철학: 가능한 한 오픈소스, 성능 우선, 락인 없음.