• RingBuffer:基于数组的缓存实现,也是创建sequencer与定义WaitStrategy的入口
  • Disruptor:持有RingBuffer、消费者线程池Executor、消费者集合ConsumerRepository等引用
  • Sequence:
  1. 通过顺序递增的序号来编号,管理进行交换的数据(事件)
  2. 对数据(事件)的处理过程总是沿着序号逐个递增处理
  3. 一个Sequence用于跟踪标识某个特定的事件处理着(RingBuffer、Producer、Consumer)的处理进度
  4. 可以看成是一个AtomicLong用于标识进度
  5. 防止不同Sequence之间cpu缓存伪共享(Flase Sharing)的问题
  • Sequencer:
  1. 真正Disruptor核心
  2. 有两个实现:SingleProducerSequencer、MultiProducerSequencer
  3. 主要实现生产者和消费者之间快速、正确地传递数据的并发算法
  • Sequence Barrier
  1. 用于保持对RingBuffer的Main Published Sequence(Producer)和Consumer之间的平衡关系;
  2. 还定义了决定Consumer是否还有可处理的事件的逻辑
  • WaitStrategy
  1. 决定一个消费者将如何等待生产者将Event置入Disruptor
  2. 主要策略:BlockingWaitStategy、SleepingWaitStategy、YieldingWaitStategy
  3. BlockingWaitStategy:最低效,对cpu消耗最小并且在各种部署中提供更加一致的性能表现
  4. SleepingWaitStategy:性能表现跟BlockingWaitStategy差不多,对cpu消耗类似,但对生产者线程影响最小,适合用于异步日志类似场景
  5. YieldingWaitStategy:的性能最好的,适合用于低延迟的系统。在要求极高性能且事件处理线束小于cpu逻辑核心数的场景中,推荐使用此策略,如cpu开启超线程的特性(推荐
  • Event:
  1. 从生产者到消费者过程中所处理的数据单元
  2. Disruptor中没有代码表示Event,因为它完全是由用户自定义的
  • EventProcessor:
  1. 主要事件循环,处理Disruptor中的Event,拥有消费者的Sequence
  2. 他有一个实现类,BatchEventProcessor,包含event loop有效实现,并且将回调到一个EventHandler接口的实现对象
  • EventHandler:由用户实现并且代表Disruptor中的一个消费者的接口,也是我们消费者逻辑都毒液写在这里
  • WorkProcessor:确保每个Sequence只被一个processor消费,在同一个WorkPool中处理多个WorkProcessor不会浪费同样的Sequence。

Disruptor图解

Disruptor核心概念-LMLPHP

09-29 05:22