Storm以及JStorm都用了distruptor作为线程间交互工具,所以仔细拿来看看吧。
Disruptor有一个blog
http://code.google.com/p/disruptor/wiki/BlogsAndArticles
和一些基本介绍
http://mechanitis.blogspot.com/2011/06/dissecting-disruptor-whats-so-special.html
http://mechanitis.blogspot.com/2011/06/dissecting-disruptor-how-do-i-read-from.html
有人翻译了
http://www.cnblogs.com/shanyou/archive/2013/02/04/2891300.html
http://www.cnblogs.com/shanyou/archive/2013/02/04/2891301.html
http://www.cnblogs.com/shanyou/archive/2013/02/08/2909179.html
一下简要翻译自https://github.com/LMAX-Exchange/disruptor/wiki/Introduction
理解Disruptor最好的方式就是使用一个组件去对其进行类比,所以Java中的BlockingQueue是与Disruptor最相像的了。Disruptor主要用于将数据从多个线程之间进行移动,当然,Distruptor也有很多不同于BlockingQueue的地方:
- 根据消费者的依赖关系对消费者进行广播
- 对消息进行内存预留(Pre-allocate memory for events)
- 可支持没有锁的方式Lock-Free
核心概念
在理解Disruptor如何工作之前,有必要解释几个code中常用的概念
RingBuffer: RingBuffer曾作为Disruptor的核心概念,然而从3.0开始 RingBuffer仅用作Disruptor数据的存储以及更新操作。在一些复杂的用例中,RingBuffer甚至可能被重写。
Sequence: Disruptor用Sequence标示每个component由谁管理。每个消费者(Event Consumer)以及Disruptor都维护一个Sequence。大部分的并行代码都依赖于更改Sequece中的值,因此,Sequcenc支持大量类似AtomicLong的操作。事实上二者的区别仅为Sequence含有一些额外的函数用于阻止一些错误的数据共享。
Sequencer:Sequencer是Disruptor真正的核心,该接口的两个实现(single/multi Producer )实现了全部并行算法,这些并行算法用于在Producer以及Consumer之间进行快速,可靠的数据交互。
Sequencer Barrier: Sequencer Barrier是由
-
参考资料
https://github.com/LMAX-Exchange/disruptor/wiki/Getting-Started
Disruptor白皮书
https://code.google.com/p/disruptor/wiki/BlogsAndArticles
https://github.com/LMAX-Exchange/disruptor/wiki/Introduction
https://github.com/LMAX-Exchange/disruptor/wiki/Getting-Started