Disruptor无锁设计

Disruptor无锁设计一定程度上避开了锁机制。

Disruptor无锁设计一定程度上避开了锁竞争的问题。

Apache Storm、Log4j2框架使用Disruptor提升性能。

Disruptor是英国外汇交易公司LMAX开发的一款高性能队列。最初为解决内存队列延迟问题(基于Disruptor开发的系统单线程能支撑每秒600万订单)。

Disruptor是一个BlockingQueue,目的让同一个处理器上的不同线程能相互的移动数据(message or event)。

Disruptor有一些重要的特性:

为事件预分配内存、根据消费依赖路径多路发送事件给消费者,并有可选的lock-free。

核心

Disruptor RingBuffer能做到完全无锁,重点在于“单线程写“。

每个生产者或消费者线程,先申请可操作的数组下标,申请得到后,在该位置写入或者读取数据。

这个过程是一个get-and-increment操作,如:

当一个线程获取到一个可用下标后,同时会将下一个位置定义为可用下标,这个过程是基于CAS操作。

特性

Disruptor使用一个环形数组做为队列,避免垃圾回收,数组对处理器缓存也更友好。

队列元素定位

数组长度为2^n,下标采用递增方式,通过位运算快速定位,不必担心下标越界的问题。

如,Seq & (QueueSize - 1) 。

QueueSize大小为8,Seq为10,计算二进制1010 & 0111 = 2,直接获取index=2的元素。

无锁设计

生产者或消费者线程,会先申请可操作元素在数组中的位置,申请得到后,在该位置写入或者读取数据。

缓存优化

Disruptor通过补全确保ring buffer的序列号,不与其它数据同时存储在一个缓存行。

详情参考内存对齐对性能的影响