Disruptor 高性能并发框架
by 陈健森 at 2016.6
简述
Disruptor 是一个异步并发处理框架。是由 LMAX 公司开发的一款高效的无锁内存队列。它使用无锁的方式实现了一个环形队列,非常适合于实现生产者和消费者模式,比如事件和消息的发布。
Disruptor 最大特点是高性能,其 LMAX 架构可以获得每秒 6 百万订单,用 1 微秒的延迟获得吞吐量为 100K+。
RingBuffer
RingBuffer 是其核心,生产者向 RingBuffer 中写入元素,消费者从 RingBuffer 中消费元素。

随着你不停地填充这个 buffer(可能也会有相应的读取),这个序号会一直增长,直到绕过这个环。
槽的个数是 2 的 N 次方更有利于基于二进制的计算机进行计算。(注:2 的 N 次方换成二进制就是1000,100,10,1这样的数字, sequence & (array length-1) = array index,比如一共有 8 槽,3&(8-1)=3,HashMap 就是用这个方式来定位数组元素的,这种方式比取模的速度更快。)
会预先分配内存,可以做到完全的内存复用。在系统的运行过程中,不会有新的空间需要分配或者老的空间需要回收。因此,可以大大减少系统分配空间以及回收空间的额外开销。
简单例子
maven引入jar包
创建数据类
工厂类,生产 PCData
消费者
生产者
测试类
输出结果
根据 Disruptor 的官方报告,性能要比 BlockingQueue 至少高一个数量级以上。
提高消费者的相应时间:选择合适的策略
BlockingWaitStrategy:这是默认的策略。使用锁和条件进行数据的监控和线程的唤醒。因为涉及到线程的切换,是最节省 CPU,但在高并发下性能表现最糟糕的一种等待策略。
SleepingWaitStrategy:会自旋等待数据,如果不成功,才让出 cpu,最终进行线程休眠,以确保不占用太多的 CPU 数据,因此可能产生比较高的平均延时。比较适合对延时要求不高的场合,好处是对生产者线程的影响最小。典型的应用场景是异步日志。
YieldingWaitStrategy:用于低延时的场合。消费者线程不断循环监控缓冲区变化,在循环内部,会使用
Thread.yield()让出 cpu 给别的线程执行时间。BusySpinWaitStrategy:开启的是一个死循环监控,消费者线程会尽最大努力监控缓冲区变化,因此, CPU 负担比较大
Last updated