disruptor介绍
文章目录
【注意】最后更新于 May 5, 2018,文中内容可能已过时,请谨慎使用。
disruptor介绍
简介
从功能上来看,Disruptor 是实现了"队列"的功能,而且是一个有界队列。那么它的应用场景自然就是"生产者-消费者"模型的应用场合了。 可以拿 JDK 的 BlockingQueue 做一个简单对比,以便更好地认识 Disruptor 是什么。我们知道BlockingQueue是一个FIFO堵塞队列; 这些都是 Disruptor 能做到的,与之不同的是,Disruptor 能做更多:
- 同一个"事件"可以有多个消费者,消费者之间既可以并行处理,也可以相互依赖形成处理的先后次序(形成一个依赖图);
- 预分配用于存储事件内容的内存空间;
- 无锁的设计;
Disruptor 的核心概念
先从了解 Disruptor 的核心概念开始,来了解它是如何运作的。下面介绍的概念模型,既是领域对象,也是映射到代码实现上的核心对象。
-
Ring Buffer
如其名,环形的缓冲区。曾经 RingBuffer 是 Disruptor 中的最主要的对象,但从3.0版本开始,其职责被简化为仅仅负责对通过 Disruptor 进行交换的数据(事件) 进行存储和更新。在一些更高级的应用场景中,Ring Buffer 可以由用户的自定义实现来完全替代。
-
Sequence
Disruptor使用序列作为一种手段来确定特定组件的位置。每个消费者(EventProcessor)都像Disruptor本身一样维护一个Sequence。大部分并发代码依赖于这些Sequence值 的移动,因此Sequence支持AtomicLong的许多当前特性。事实上,2之间唯一真正的区别是序列包含额外的功能,以防止序列和其他值之间的错误共享(CPU缓存伪共享(Flase Sharing)问题)。
-
Sequencer
Sequencer是Disruptor的真正核心。这个接口的2个实现(单生产者,多生产者)实现了所有的并发算法,用于在生产者和消费者之间快速正确地传递数据。
-
Sequence Barrier
序列屏障由序列发生器产生,包含对序列发生器的主要发布序列和任何相关消费者的序列的引用。它包含确定消费者是否有任何事件可供处理的逻辑。
-
Wait Strategy
定义 Consumer 如何进行等待下一个事件的策略。 (注:Disruptor 定义了多种不同的策略,针对不同的场景,提供了不一样的性能表现)
-
Event
在 Disruptor 的语义中,生产者和消费者之间进行交换的数据被称为事件(Event)。事件没有特定的代码表示,因为它完全由用户定义。
-
EventProcessor
EventProcessor 持有特定消费者(Consumer)的 Sequence,并提供用于调用事件处理实现的事件循环(Event Loop)。 BatchEventProcessor 包含事件循环的有效实现,并将回调到EventHandler接口的已使用提供的实现。
-
EventHandler
Disruptor 定义的事件处理接口,由用户实现,用于处理事件,是 Consumer 的真正实现。
-
Producer
即生产者,只是泛指调用 Disruptor 发布事件的用户代码,Disruptor 没有定义特定接口或类型。