이야기박스
LMAX Architecture - Disruptor 본문
공식 문서를 번역(구글 번역기)하고 정리 하였습니다.
Introduction
Disruptor의 목적
동일 프로세스 내, 스레드 간의 데이터(메시지, 이벤트 등..)를 이동시키는 것
일반적으로 Java의 BlockingQueue와 유사하지만 다음과 같은 차이가 있습니다.
- Multicast events to consumers, with consumer dependency graph.
- Pre-allocate memory for events.
- Optionally lock-free.
Ring Buffer
Multicast Event
위에서 언급했듯이 큐와 disruptor의 가장 큰 차이 중 하나입니다. 큐가 단일 소비자에게 단일 이벤트를 전달하는 것과 다르게, disruptor는 여러 소비자가 모든 이벤트에 대한 정보를 받습니다.
Disruptor의 동작은 동일한 데이터에 대해 여러 병렬 작업을 독립해야 하는 경우 사용합니다.
LMAX의 3가지 작업
- journaling : 입력 데이터를 영구 저널 파일에 쓰기
- replication : 입력 데이터를 다른 머신으로 전송
- business logic : 실제 프로세스 동작 부분
위의 그림에서 보면, JournalConsumer, ReplicationConsumer, ApplicationConsumer가 병렬로 동작하는 것을 확인할 수 있습니다.
Consumer Dependency Graph
실제 동작을 위해서는, 소비자들간의 조정이 필요합니다.
gating
journaling & replication 소비자가 작업을 완료하기 전까지, 다른 business logic 소비자가 동작하지 않도록 하는 것입니다.
gating 동작이 일어나는 시기
- producer들이 consumer들보다 overrun하지 않도록 할 때 --> RingBuffer.addGatingConsumers()를 동작함
- SequenceBarrier를 구성하여 구현될 때
위 그림의 예에서 JournalConsumer와 ReplicationConsumer는 자유롭게 병렬 실행이 가능합니다. ApplicationConsumers 시퀀스는 다른 JournalConsumer나 ReplicationConsumer보다 작아야 합니다.
Event Preallocation
disruptor의 또다른 목표 중 하나는 짧은 지연시간에서 사용할 수 있도록 하는 것이었습니다. gc 동작을 줄이기 위해 disruptor에서는 필요한 공간을 미리 할당하는 preallocation 방식을 사용하였습니다.
Optionally Lock-free
짧은 대기 시간을 추진하기 위하여 무잠금 알고리즘을 지향한다고 하네요.
참조
'Computer & Data > Big Data' 카테고리의 다른 글
[MariaDB] errno: 150 "Foreign key constraint is incorrectly formed" (1) | 2018.12.11 |
---|---|
What is ORC File Format? (0) | 2018.12.05 |
Nomalization (정규화) (0) | 2018.10.25 |
Pipeline SDK (Apache Beam & Cloud Dataflow) (0) | 2018.10.10 |
Protocol Buffers (1) | 2018.07.06 |