365일 x 24시간 사용을 위해 설계된 신뢰할 수 있는 고 빈도 트레이딩 거래소
페멕스에 대한 소개
저는 2017년에 저의 파트너들과 다른 암호화폐 거래소들을 살펴보며 기존 거래소들의 성능에 부끄러울 정도로 충격을 받았습니다. 거래소들은 사용자 수가 기하급수적으로 증가함에 따라 성능 및 안정성 문제가 더욱 심각하게 드러났습니다. 많은 거래소가 서비스를 일시적으로 중단했거나 다운그레이드하지 않고 핵심 시스템을 업데이트하기 위해 어려움을 겪고 있고 이 같은 상황은 2년이 지났는데도 크게 바뀌지 않았습니다.
저는 모건 스탠리의 글로벌 증권사에서 11년 동안 일했습니다. Morgan Stanley의 MSET(전자 거래) 및 BXS(벤치마크 실행 전략) 팀의 동료들과 함께 우리는 고객의 거래가 급증 하는것에 대한 대응시스템을 구축하는 데 전문 능력을 가지고 있습니다.
이러한 거래시스템은 세계의 거의 모든 주요 거래소를 연결합니다. 우리의 서비스는 주식, 선물, 옵션, FX 등을 포함합니다. 저와 제 파트너들은 암호화폐 시장에서 우리의 PHEMEX거래소를 런칭하게 되어 기쁩니다.
우리는 암호화폐 업계에 무엇이 부족하고 우리가 이 업계를 위해 할 수 있는 것들에 대해 정확히 알고 있습니다.
대부분의 전통 자산 (EX.금 , 주식 등)거래소들은 일주일에 5일, 하루에 6시간 개방됩니다. 심지어 FX 거래소도 일요일에는 문을 닫습니다. 하지만, 이것은 암호 화폐 업계는 그렇지 않습니다.
우리의 사용자들(암호화폐 투자자들)은 언제 어디서나 암호화폐를 거래하기를 원합니다. 당연히 비트멕스나 바이낸스 같은 거래가 멈추지 않는 거래소는 암호화폐 사용자들 사이에서 표준 서비스가 되었습니다. 이 기사에서는 Phemex 핵심 시스템 아키텍처에 대해 자세히 살펴보고 설계 원칙과 관행에 대해 논의하고자 합니다. 쉽게 업그레이드 될 수 있고, 초당 30만 건 이상의 주문을 처리하는 데 사용되는 기술을 가진 Phemex Cross Engine도 살펴보겠습니다. 엔진의 기능덕분에 시장 주문 입력 및 체결에 대한 응답 시간은 0.2ms 미만입니다. 전체 Phemex 시스템은 유지보수 또는 업그레이드 중에도 멈추지 않았습니다. 받은 만큼 돌려주는 것이 페멕스의 핵심 가치 중 하나이기 때문에, 우리는 업계 및 커뮤니티와 우리의 핵심 아키텍처를 공유하는 첫 번째 거래소가 되었습니다. 라이브 데모는 마지막 섹션에서도 확인할 수 있고, 이 데모는 우리의 테스트넷에서 응용할 수 있습니다.
페멕스의 설계
Phemex 핵심 엔진은 CrossEngines, TradingEngines, and LiqEngines와 같이 세 가지 논리적 부분으로 나눌 수 있습니다
CrossEngine은 목록 단위로 오더북(주문서)을 보관합니다. 가격 및 시간 우선 순위에 따라 주문을 서로 매칭시켜 실행합니다. TradingEngines은 고객이 주문을 요청한 것을 수락 할 수 있는 권한이 있습니다.
그리고 비용, 수수료, PnL(손익) 계산 등 고객 주문 및 거래 계좌에 대한 실시간 위험을 체크하여 모두 관리합니다. 클라이언트가 사용 가능한 잔액이 충분한 경우 클라이언트가 주문한 요청이 CrossEngine으로 전송됩니다. 페멕스는 레버리지 거래를 제공합니다. 따라서, TradingEngines의 또 다른 중요한 역할은 호가 표시된 가격을 모니터링하고 적시에 청산하는 것입니다. Liq Engine은 청산 및 자동으로 거래를 지우는 기능을합니다. Phemex MQ(Phemex Message Queue)는 메시지 순서를 결정하고, 혹시 모를 공격에 복구를 위해 모니터링 하는 역할을 하고 있습니다. 이 제품은 무게가 가볍지만 강력한 구성으로 되어있고 높은 이용성을 보장합니다.
Phemex는 성능을 극대화하기 위해 몇 가지 관례를 따릅니다.
- 여러 개의 스레드를 사용하는 대신 여러 프로세스를 사용합니다. 대부분의 프로세스는 단일 스레드입니다. 프로세스 처리과정에서 생겨나는 비용 또는스레드 스케줄링 비용을 걱정할 필요 없이 성능을 높이기 위해 전용 CPU 코어로 예약할 수 있습니다.
(*스레드 (thread) :다중 작업 환경에서 운영 체제가 여러 프로그램을 병행하여 처리할 때 효율적인 처리를 위하여 분할한 처리 단위) - 핵심 엔진은 중요한 경로에서 잠금이 해제되어 있습니다. 거래 엔진의 수를 늘리면 전체 성능이 거의 점차적으로 향상될 수 있습니다.
- 각각의 Phemex에서실행 가능한 이진수 데이터 파일은 매우 작습니다. 그리고 타사 라이브러리 의존도를 최소화했으며,시스템이 단순할수록 더 안정적이고 유지하기가 쉬워집니다. 각 공정은 매우 가볍기 때문에, 우리 시스템은 자원을 보다 절약할 수 있습니다. 마지막으로 일체형 프로세스에 비해 기능의 규모가 작기 때문에 테스트가 더 쉽습니다.
Phemex core는 C++/17로 작성되어 있습니다. C++는 시스템을 구축할 수 있는 진정한 힘과 유연함을 제공하여 아무런 제약 없이 사용할 수 있습니다.
페멕스의 MQ
시스템 복구 중에서 Phemex MQ는 중요한 역할을 합니다.
MQ에는 4가지 주요 기능이 있습니다.
- 메시지 결과값결정
• 중복 검출
• 지속적인 메시지
• 기록된메시지 리플레이
다음은 일반적인 시퀀스의 작동 방법입니다. 마스터 MQ는 메시지가 도착하면 각각 시퀀스 번호를 제공합니다.
그 다음, 복제기(또는 슬레이브)로 보내집니다. 복제기가 메시지를 수신하면 이 메시지는 보관되고 마스터 MQ에 확인 메시지를 다시 보냅니다. 첫 번째 확인 메시지가 도착하면 마스터 MQ는 메시지를 다운스트림으로 전달합니다.
이 때, 인증된 시퀀스 번호로 메시지가 전달되도록 합니다. 시퀀스 번호는 연속적이고 단조롭게 증가합니다.
복제기는 다양한 방법(공유 메모리, 데이터베이스 및 일반 파일 형태)으로 메시지를 보관할 수 있습니다.
마스터 MQ가 클라이언트 메시지를 다운스트림으로 보내기 전에, 하나 이상의 복제기가 클라이언트 메시지를 유지하고 있어야 합니다. 혹시모를 공격에 엔진을 복구하는 중이라면, 마스터 MQ는 최신 시퀀스 번호에서 복구한 다음 새 메시지로 프로세스를 계속합니다. 다운스트림 응용 프로그램이 충돌하고 다시 연결될 때,
MQ 반복재생기에서 메시지 데이터를 수집하여 동일한 시퀀스를 통해 전송합니다. 다운스트림 엔진은 일관된 결과를 만들기 위해 메시지 시퀀스에 응답하도록 설계되었습니다.(자세한 내용은 교차 엔진 섹션 참조).
마스터 MQ와 다운스트림 엔진은 모두 복제기에 의존하여 최신 시퀀스 번호와 누락된 기록 데이터를 복구하므로
서로 다른 위치에서 여러 복제기를 배포하는 것이 중요합니다. 이론적으로 복제기가 더 많을수록, 더 안전합니다. 일반적인 배포되는 구조는 다음과 같습니다. 다중 복제기는 데이터 손실 위험을 상당히 줄여줍니다. 이러한 모든 복제기는 서로 통신하고 정기적으로 데이터를 동기화하기 위해 간단한 프로토콜을 사용합니다. 복제기가 재시작되면 MQ 반복 재생기에서 다른 복제기 중 하나에서 누락된 데이터를 가져오도록 요청합니다. 예를 들어, 복제기 5번은 메시지 #42를 수신한 후 충돌합니다. 충돌 후 다시 시작되면 마스터 MQ가 복제기에게 현재 시퀀스 번호가 #50임을 알려줍니다. 그런 다음, 복제기 5번이 MQ 반복재생기에 요청하여 #43에서 #49까지 누락된 메세지를 수집하고 재전송합니다. 그리고 Phemex MQ는 시퀀스 번호가 동일한 중복 메시지를 삭제합니다. MQ가 엔진 결과를 지속하는데 사용되면 동일한 결과를 인식하고 중복된 결과를 폐기할 수 있습니다.
따라서, 엔진은 MQ에서 중복된 항목에 대한 걱정 없이 계산을 안전하게 할 수 있게됩니다.
크로스엔진
CrossEngine의 가장 중요한 작업은 각 거래 묶음에 대한 주문서를 유지하는 것입니다.
공격적으로 많은 주문서가 도착하게되면, 일반적으로 예약된 다른 주문으로 채워집니다.
가격 및 시간의 우선선위에 따라 올바른 주문에 대한 실행순서를 정할 수 있습니다.
CrossEngine은 여러 단계를 거쳐 최적화되어 번개처럼 빠르게 실행됩니다.
매우 작은 메모리 공간으로도 초당 300k 이상의 메시지를 처리할 수 있습니다.
빠른 Crossengine을 갖는 것이 매우 중요하다는 것을 알 수있고,
불행히도 기존의 1티어 거래소들은 과부하문제를 해결하지 못했습니다.
놀랍게도 1티어 거래소들의 성능과 아키텍쳐 측면에서 잘못된 선택으로 인해 거래에 대한 환경이 좋지 않습니다.
시장이 대규모로 움직인다면, 사용자는 거래가 중단되고 청산으로 인한 손실에 직면하게 되므로 엄청난 위험을
감수해야합니다. CrossEngine은 거래에서 중요한 역할을 하기 때문에 단순한 오류로 작동되지는 않습니다.
Phemex CrossEngine은 요청 MQ(ReqMQ)로부터 클라이언트 주문요청을 받습니다.
이전 섹션에서 설명한대로 요청MQ는 클라이언트가 요청한 메시지를 순차적이고 안정적으로 생성합니다.
하나의 MQ에 연결되는 여러개의 CrossEngine으로 각 거래를 상징하는 목록을 배포합니다.
그들은 정확히 동일한 결과를 생성하고, 그림 1에서 볼 수 있듯이 CrossEngine의 일반적인 레이아웃에는
여러 개의 hot 및 warm 엔진이 있습니다. hot 엔진은 받은 요청을 처리하고 응답(RespMQ)에 대한 일치된 결과를 생성합니다.
hot 엔진이 충돌하면 다른 hot CrossEngine이 요청을 원할하게 처리하고 똑같은 결과를 생성하므로 거래 활동에
1도 영향을 주지 않습니다. 하나의 요청 메시지는 하나의 결과만을 생성하므로 결과 메시지는 요청메시지와
동일한 시퀀스 번호를 갖습니다. 또한, RespMQ는 중복결과를 버릴 수 있습니다.
warm엔진은 hot엔진과 마찬가지로 ReqMQ의 요청메시지를 처리합니다. 그러나 RespMQ로 결과를 보내지는 않습니다. Warm CrossEngine은 주문서를 메모리에서 디스크로 주기적으로 저장합니다. 예기치 않은 상황으로 인해 모든 hot Cross Engine이 종료되면 warm엔진의 영구파일에서 최신 주문서를 복구하고, ReqMQ에 누락 된 데이터를 복구하도록 요청할 수 있습니다. 가장 최적화된 방식은 여러 개의 hot 및 warm CrossEngine을 동시에 배포하는 것입니다. 그러면 성능에는 거의 영향을 미치지 않지만 시스템의 효용성이 크게 증가합니다.
트레이딩 엔진
페멕스 거래 엔진은 각 거래 계좌에 대한 주문 비용, 포지션 비용, 마진 요건, 청산 가격, 파산 가격 및 기타 데이터를 계산합니다. 이는 페멕스의 핵심 비지니스 거래 로직이기도 합니다. 거래 엔진에는 모든 거래처의 거래 계정과 주문 요청이 들어 있습니다. 수천 개의 사용자 계정을 여러 Trade Engine에 배포할 수 있습니다. 거래 엔진의 수를 늘리면 거래 요청의 처리량이 크게 늘어날 수 있습니다. 주문된 요청이 거래 엔진의 비용/위험 검사를 통과하면, 요청서를 통해 교차 엔진에 전송됩니다. 교차 엔진 RespMQ에서 주문서를 다시 실행하면 거래 엔진은 해당 포지션과 점유하고있는 마진정보를 업데이트합니다. 그리고 나서 새로운 청산 가격이 표시됩니다. 사용자 계좌, 포지션 및 주문 상태(APO 상태) 데이터는 모두 ApoMQ에 보고됩니다. 거래 엔진의 복구 프로세스는 크로스 엔진의 복구 프로세스와 유사합니다.
먼저 ApoMQ에서 최신 상태를 복구한 다음 RespMQ에서 누락된 메시지를 복구합니다. 원활한 복구를 위해 ApoMQ에서 최신 APO 상태를 지속적으로 판독하는 Warm TradeEngine도 운영하고 있습니다.
따라, 주거래 엔진을 사용할 수 없는 것으로 감지되면, warm 트레이딩 엔진이 활성화되고 작동을 시작됩니다.
리크엔진
Liq 엔진은 청산을 처리하는 목적을 전용으로 하는 특별한 거래용 엔진입니다.
거래엔진은 각 계정의 청산 가격을 계산하고, 일단 발동이 되면 청산 절차를 Liq 엔진에 위임합니다.
Liq엔진은 페멕스의 청산 보험 기금의 잔액을 보유하고 있습니다. 각 포지션을 정리하는 데 추가 자금이 필요하면 보험기금에서 적자를 메우기 위해 인출하게됩니다. 그러나 보험 기금이 완전히 빠져나가는 극단적인 경우에는 자동 개발(ADL) 프로세스가 실행됩니다. Liq Engine은 ApoMQ에서 모든 APO 상태 정보를 읽고, 각 거래 신호에 대한 각 포지션의 순위를 매깁니다. ADL 프로세스는 순위가 가장 높은 반대 포지션을 찾는 것입니다. 거래엔진과 마찬가지로 Liq Engine도 MQ를 사용하여 복구 작업을 수행하며 warm엔진을 백업하는 역할을합니다.
페멕스 퍼포먼스 라이브 데모
탑티어 거래소의 최고 TPS(초당 거래) 속도는 초당 약 수백 건의 거래라고 합니다. Phemex의 테스트넷은 BTCUSD CrossEngine에 초당 최대 20,000건의 거래를 전송하도록 자동 로봇 서비스에 입력함으로써 거래량이 많은 환경을 시뮬레이션할 수 있습니다. 또한, 거래량은 주문서, 차트 및 최근 거래 패널의 빠른 변경을 통해 눈으로 볼 수 있습니다. 이러한 기능들로 사용자들은 전혀 시간 지체 없이 거래 계좌를 정상적으로 운영할 수 있습니다.
이 기능에 대한 데모를 보시려면 https://youtu.be/i1jgEf0yx2M을 방문하십시오. 또한 이 기능을 사용할 수 있는 무료 어플리케이션도 제공합니다.
phemex는 이러한 종류의 데모 서비스를 제공하는 세계 최초의 암호화폐 거래소가 된 것을 자랑스럽게 생각합니다.
이것은 적어도 다른 거래소의 10배, 혹은 어쩌면 거래소들 모두를 합친 거래량의 10배 이상의 거래량을 감당할 능력이 phemex에게 있다는 것을 증명하기 위한 것이기도 합니다.