项目概况

Disruptor高性能队列

2026-01-291 min read后端技术
Disruptor

!!! info 介绍 Disruptor是英国外汇交易公司LMAX开发的一个高性能队列,研发的初衷是解决内存队列的延迟问题。与Kafka、RabbitMQ用于服务间的消息队列不同,disruptor一般用于线程间消息的传递。基于Disruptor开发的系统单线程能支撑每秒600万订单。

disruptor适用于多个线程之间的消息队列,作用与ArrayBlockingQueue有相似之处,但是disruptor从功能、性能都远好于ArrayBlockingQueue,当多个线程之间传递大量数据或对性能要求较高时,可以考虑使用disruptor作为ArrayBlockingQueue的替代者。 官方也对disruptor和ArrayBlockingQueue的性能在不同的应用场景下做了对比,目测性能只有有5~10倍左右的提升。 !!!

一、Disruptor的好处

通过前面的介绍我们知道Disruptor作用与ArrayBlockingQueue类似,适用于多个线程之间的消息队列。为什么呢? 因为Java中的队列就以BlockingQueue为例子,从命名上就能看出是一个阻塞的队列。当多线程的环境下会进行加锁。所以导致了性能不高,而Disruptor的设计 非常的巧妙,他形成了一个环形队列。通过消除锁,从而提高了性能。

如何你还不了解Queue,请点这里✈️

Log4j2 异步输出,在使用了Disruptor的提升如下图。来源log4j2官网

二、为什么这么快

这里涉及到的知识点比较多,如果想学性能优化的同学可以去看看。可以学习里面的设计思想和优化的方向。

Disruptor详解

伪共享概念

三、如何使用

xml
1 <dependency> 2 <groupId>com.lmax</groupId> 3 <artifactId>disruptor</artifactId> 4 <version>3.4.2</version> 5 </dependency>

3.1 定义Disruptor

java
1 //指定RingBuffer大小, 2 //必须是2的N次方 3 int bufferSize = 1024; 4 5//构建Disruptor 6 Disruptor<LongEvent> disruptor 7 = new Disruptor<>( 8 LongEvent::new, 9 bufferSize, 10 DaemonThreadFactory.INSTANCE);

3.2 定义事件处理器

java
1 //注册事件处理器 2 disruptor.handleEventsWith( 3 (event, sequence, endOfBatch) -> 4 System.out.println("E: " + event));

3.3 生产数据

java
1 //启动Disruptor 2 disruptor.start(); 3 4//获取RingBuffer 5 RingBuffer<LongEvent> ringBuffer 6 = disruptor.getRingBuffer(); 7//生产Event 8 ByteBuffer bb = ByteBuffer.allocate(8); 9for (long l = 0; l < 10; l++) { 10 bb.putLong(0, l); 11//生产者生产消息 12 ringBuffer.publishEvent( 13 (event, sequence, buffer) -> 14 event.setValue(buffer.getLong(0)), bb); 15}