1.
지난 몇 년동안 Java를 개발하는 사람들사이에서 회자한 프로젝트가 있습니다. Disruptor입니다. Java로 개발된 프로그램에 주는 Duke’s Choice Award를 2011년에 수상하였습니다. Innovative Industrial Software부문입니다. Disruptor는 현재 영국 LMAX에서 사용하고 있습니다. LMAX는 FX를 거래하는 곳입니다. 겉으로 보면 증권사같습니다만 FX는 중앙거래소가 없기때문에 LMAX자체가 거래소라고 할 수 있습니다. 고객의 호가주문을 받아서 매매체결하는 부분으로 연결시켜주기 위한 라이브러리가 Disruptor입니다. Inter-Thread Library이며 고성능지지연(Low Latency)을 가능하도록 합니다. 그런데 LMAX는 이를 오픈소스로 공개하였습니다. 이후 여러 행사에 초청받아 Disruptor를 소개하고 있습니다. 저도 InfoQ행사를 통해 온라인으로 처음 접했습니다.
그 당시 CPU를 최대한 활용하는 프로그램방법을 고민하고 있었기 때문에 Disruptor는 무척이나 신선했습니다. Atomic, Memory Barriers/Fences, Write Combing, False Sharing같은 개념이 등장하니까 이해하기도 힘들었습니다. 그래도 ZeroAOS를 개발할 때 참고하려고 시간이 날 때마다 조금씩 조금씩 읽어둡니다.
Disruptor를 간단히 이야기하면 아래와 같습니다.
Disruptor is ring buffer architecture for efficiently sending messages between threads without relying on shared queues (which CPU memory-access architecture causes contention). It leverages and improves upon some features of SEDA (which was serial) and the Actor model. It can handle 6 million TPS on a single thread. A Business Logic Processor runs in-memory using event sourcing and is surrounded by Disruptors – concurrency components that implements a network of queues that operate without needing locks. It allow consumers to wait on the results of other consumers without an intermediate queue.
그동안 Disruptor를 소개한 자료가 많았지만 아래 자료가 최근에 가장 잘 정리한 자료입니다.
Disruptor를 개발한 분이 운영하는Mechanical Sympathy을 방문하시면 설계 시상을 읽을 수 있습니다. 또한 Java, C++및 .NET으로 구현한 소스는 아래에서 구하실 수 있습니다.
Disruptor Java
Disruptor C++
Disruptor .NET
2.
굳이 Java로 개발된 오픈소스 프로젝트를 소개하는 이유가 무엇일까요? Thread간의 통신을 다루기 때문입니다. 어제 주문유효성에 관한 단상을 적었습니다. 설계에 따라 다르겠지만 Thread간 통신을 아주 빠르게 하는 방법은 Low Latency를 위해 무척이나 중요합니다. 주문수신 – 주문의 유효성 점검 – 거래소로 주문송신을 담당하는 각 Thread 혹은 Process간의 통신을 어떻게 처리하느냐에 따라 성능이 달라집니다. IPC를 위해 TCP_nodelay, Unix Domain Socket, Mempie, Pipe, TCP 혹은 Shared Memory를 이용할 수 있습니다. IPC-Bench를 이용한 성능측정 자료를 정리해놓은 곳도 있습니다.
ipc-bench: A UNIX inter-process communication benchmark
Disruptor는 이런 방법과 다릅니다. 만약 Thread를 이용하여 구현하고자 할 경우 선택가능한 방법입니다. 현재 Exture+는 이와 비슷한 기능을 ZeroMQ를 이용하여 구현한다고 합니다.
Inter Thread Messaging방식으로 미니원장과 FEP를 구현해보시면 어떨까요?