1、初看Disruptor,给人的印象就是RingBuffer是其核心,生产者向RingBuffer中写入元素,消费者从RingBuffer中消费元素。

Disruptor核心原理-LMLPHP

2、RingBuffer到底是什么?

  • 他是一个环(首尾相接的环)
  • 他用作在不同上下文(线程)间传递数据的buffer
  • RingBuffer拥有一个序号,这个序号指向数组中下一个可用元素

Disruptor核心原理-LMLPHP

  1. 先获取下一个可用序号(4)
  2. 根据4获取再赋值

3、讲一个小故事:扔芝麻与捡芝麻的小故事

  • Disruptor说的是生产者和消费者的故事
  • 有一个数组:生产者往里面扔芝麻,消费者从里面捡芝麻
  • 但是扔芝麻和捡芝麻也需要考虑速度问题
  1. 消费者捡得速度比扔的快,那么消费者要停下来,生产者扔了新的芝麻,然后消费者继续
  2. 数组长度是有限的,生产者到末尾的时候会再从数组的开始位置继续。这个时候可能追上消费者,消费者还没有从那个地方捡走芝麻,此时生产者需要等待消费者捡走芝麻,然后继续。
  3. 随着你不停补充buffer(可能会有相应读取),这个序号会一直增长,知道绕过这个环

                                                     Disruptor核心原理-LMLPHP

如图,当第13个,需要等待3被消费。10、11、12替换了之前的0、1、2(被消费了)。

4、要找到数组中当前序号指向的元素,可以通过mod操作。

sequence mod array length = array index(取模操作)

以上面的RingBuffer为例(java的mod语法):12%10=2 即第二个位置。

5、事实上,上图中的RingBuffer只有10个槽完全是个意外。如果槽的个数是2的N次方,更有利于给予二进制的计算机进行计算。

09-29 01:03