Disruptor核心原理
- 初看Disruptor,给人的印象RingBuffer是其核心,生产者向RingBuffer写元素,消费者从RingBuffer消费元素;
组件com.lmax.disruptor.dsl.Disruptor定义
- 可以理解成辅助类,用于启停,和消费者建立连接,里面包含了RingBuffer,消费者线程池Executor,消费者集合ConsumerRepository等引用;
RingBuffer到底是什么?
- 它是一个环,一个首尾相接的环;
- 它作为在不同上下文(线程)间传递数据的buffer;
- RingBuffer拥有一个序号,这个序号指向数组中下一个可用元素,即其底层数据结构是一个数组;
RingBuffer定义
- 基于数组的缓存实现,也是创建sequencer与定义WaitStrategy的入口,sequencer理解成序号,WaitStrategy理解成策略;
生产者和消费者之间的平衡
- RingBuffer是个数组,生产者往里丢元素,消费者从里面消费元素;
- 生产和消费的速度可能不一样
- 如果消费者的速度快,数组中没有可消费的元素了,消费者会停下来,生产者向数组中丢了新元素,消费者才会继续消费;
- 生产者丢到数组末尾的时候,会从数组的开始位置继续丢,如果生产者速度快,追上了消费者,即生产者要丢的位置上,之前的元素还没有被消费,生产者就要等待消费者消费了该元素再继续丢;
RingBuffer底层数据结构
- 要找到数组中当前序号指向的元素,可以通过取模,sequence % array.length,比如数组长度10,sequence=12,12%10=2,2就是生产者下一个插入位置;
- 如果RingBuffer的长度是2^n,更有利于基于二进制的计算机进行计算;