官方手册:https://lmax-exchange.github.io/disruptor/user-guide/index.html
https://lixiangyun.gitbook.io/disruptor/readme-1#xia-zai
美团文章:https://tech.meituan.com/2016/11/18/disruptor.html

disruptor核心概念

Ring Buffer 环形缓冲区
从3.0开始,环缓冲区只负责存储和更新通过disruptor的数据
Sequence 序列
Sequencer 序列生成器
Sequence Barrier 序列屏障
Wait Strategy 等待策略
Event 事件
Event Processor 事件处理者
Event Handler 时间处理句柄
Producer
image.png
Disruptor的特点:

开发步骤是比较固定的一个开发步骤

image.png
1:定义Event-队列中需要处理的元素。
在Disruptor他是每一个消息都认为是一个事件,在他这个概念里就是一个事件,所以在这个环形队列里面存的是一个一个的Event。
2:定义Event工厂,用于填充队列
那这个Event怎么产生,就需要指定Event的工厂。
3:定义EventHandler(消费者),处理容器中的元素
那这个Event怎么消费呢,就需要指定Event的消费者EventHandler。
等待策略

  • (常用)BlockingWaitStrategy:通过线程堵塞的方式,等待生产者唤醒,被唤醒后,再循环检查依赖的sequence是否已经消费。
  • BusySpinWaitStrategy:线程一直自旋等待,可能比较耗cpu
  • LiteBlockingWaitStrategy:线程阻塞等待生产者唤醒,与BlockingWaitStrategy相比,区别在signalNeeded.getAndSet,如果两个线程同时访问一个访问waitfor,一个访问signalAll时,可以减少lock加锁次数
  • LiteTimeoutBlockingWaitStrategy:与LiteBlockingWaitStrategy相比,设置了阻塞时间,超过时间后抛出异常
  • PhasedBackoffWaitStrategy:根据时间参数和传入的等待策略来决定使用那种等待策略
  • TimeoutBlockingWaitStrategy:相对于BlockingWaitStrategy来说,设置了等待时间,超过后抛出异常
  • (常用)YieldingWaitStrategy:尝试100次,然后Thread.yield()让出cpu
  • (常用)SleepingWaitStrategy:sleep

我们常用的BlockingWaitStrategy满了就等着;SleepingWaitStrategy满了就睡一觉,睡醒了看看能不能继续执行了;YieldingWaitStrategy让出cpu,让你消费者赶紧消费,消费完了之后我又回来看看我是不是又能生产了;一般YieldingWaitStrategy效率是最高的,但也要看实际情况适用不适用。

RingBuffer

image.png

Sequence

image.png
image.png

Sequencer

image.png

WaitStrategy

Event

EventProcessor

image.png
image.png

EventHandler

image.png

WorkProcessor

多生产者多消费者

image.png
image.png
image.png