꽉 조여진 꼬리. p99에서 놀라움 없음.
락프리 SPSC 큐, 분기 없는 태그 디코더, 핫 패스 인라이닝. 가장 느린 메시지가 가장 빠른 것처럼 보입니다. 그것이 거래소가 실제로 평가하는 지표입니다.
하트비트 누락을 용납하지 않는 거래소를 위해 구축된 C++23 FIX 프로토콜 엔진. 핫 패스 제로 할당, 마이크로초 미만 파싱, 결정론적 세션 상태.
예측 가능. 구석구석까지.
운영 매뉴얼에서 찾게 될 모든 수치. 부하 상태에서 일반 하드웨어로, 결정론적 재생을 기반으로 측정.
서로 누적되는 세 가지 아키텍처 선택. 각각이 다음을 가능하게 만듭니다.
락프리 SPSC 큐, 분기 없는 태그 디코더, 핫 패스 인라이닝. 가장 느린 메시지가 가장 빠른 것처럼 보입니다. 그것이 거래소가 실제로 평가하는 지표입니다.
정적 arena, 침투형 프리리스트, 고정 크기 메시지 슬롯. 주문이 흐르는 동안 할당자는 실행되지 않습니다. 따라서 커널도 페이지 회수를 위해 선점하지 않습니다.
버전별로 생성된 딕셔너리, 세션별 런타임 선택 가능. 거래소 특정 필드용 커스텀 방언 오버레이. 거래소가 실행하는 와이어 포맷이 당신이 보내는 포맷입니다.
주요 주식, 선물, FX, 암호화폐 거래소를 위한 사전 구축된 세션 프로파일. 실제 프로덕션 트레이스에서 포착한 하트비트, 시퀀스 리셋 시맨틱, 재전송 요청 특이점 포함.
동일한 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 는 20 년 동안 업계의 무거운 짐을 도맡아 왔습니다. 그 당시 선택이 병목이 될 때 NexusFIX 를 찾게 됩니다.
| QuickFIX | NexusFIX | |
|---|---|---|
| 핫 패스 할당 | 메시지당 ~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 없음 |
와이어 바이트가 들어오고, 라우팅된 주문이 나갑니다. 세 단계, 모두 같은 스레드에서, 모두 할당 없이.
SOH 구분 스트림이 제자리에서 순회됩니다. 각 태그는 원본 버퍼에 대한 타입드 뷰로 해석되고, 숫자 필드는 분기 없이 파싱되며, 방언 오버레이는 세션 바인드 시점에 적용됩니다.
시퀀스 번호, 하트비트 윈도우, gap-fill 시맨틱, resend-request 의 변종들. venue 프로파일마다 생성된 상태 머신이 처리하며, 모든 전이가 memory-mapped 저널에 기록됩니다.
고정 아레나의 오더 슬롯을 획득하고, 참조로 채운 뒤, 락프리 SPSC 큐를 통해 애플리케이션으로 전달합니다. 슬롯은 주문이 종료 상태에 이를 때까지 살아 있다가 아레나로 반환됩니다.
다음에 당겨볼 두 가지 줄. 아키텍처 심층 글, 또는 라이브 대화형 설명자.
NexusFIX 는 단일 정적 라이브러리와 CLI 세션 시뮬레이터로 배포됩니다. venue 설정과 핸들러를 가져오면, 로컬에서 결정적인 FIX 세션이 돌아갑니다. 저널에서 재생 가능하고, 바이트까지 추적 가능합니다.
NexusFIX 는 우리가 만드는 세 가지 엔진 중 하나입니다. 같은 철학: 가능한 한 오픈소스, 성능 우선, 락인 없음.