Disruptor简介
Disruptor是LMAX交易所开源的一个用于线程间通信高性能代码库。基于Disruptor开发的系统单线程能支撑每秒600万订单的处理。Disruptor主要通过RingBuffer的环形数据设计来避免垃圾回收,同时最大化地利用CPU的缓存机制。另外一方面就是使用无锁设计,充分利用现代计算的CAS指令,保证线程安全。
背景知识
伪共享
伪共享指的是两个线程分布修改不同变量的值,由于不合理的设计导致两个互不相关的变量位于同一个缓存行里面,进而引发缓存行的失效,导致的不必要的竞争,从而影响性能的现象。参考知识:MESI协议、CPU缓存、CPU与计算机其他部件的交互时间 、java的魔法类Unsafe
锁、CAS、无锁的性能差异
首先需要明白的是带锁的操作性能是很差。CAS的性能比带锁的操作性能要好很多,但是会对CPU造成大量的浪费。无锁操作的性能是最好的,但是不能保证多线程的安全。对于有兴趣的朋友,可以自己测试一下。
Disruptor整体架构
Disruptor的核心类图
各个图的交互概览入下所示:
1、producer流程
对于单生产者的模式,由于不涉及多线程的竞争,故我们只需要保证,生产者的生产速度不要太快,而consumer来不及消费,产生的竞争。核心代码也比较简单
只是增加了cache,封装了一层逻辑而已。
对于多producer的情况,稍微比单producer复杂一点,增加了producer之间的竞争。核心代码如下:
2、consumer流程
consumer通过SequenceBarrier与RingBuffer交互,SequenceBarrier的实现类ProcessingSequenceBarrier的核心代码如下:
这个代码实现了,consumer与producer之间的平衡,也实现串联consumer之间的关系。
consumer和producer类似,consumer的标志是EventProcessor。Disruptor实现了两种情况常见的消息模式:广播、组播。
广播是指每条消息都会被所有的消费者单独处理。
通过BatchEventProcessor实现,代理EventHandler处理实际的业务逻辑,核心逻辑:
组播是指每条消息有且仅有一个消费者组里面的一个消费者处理。
通过WorkProcessor实现,代理WorkHandler实现,核心逻辑代码如下: