Disruptor在撮合引擎的实践|得物技术

一、Disruptor的简介

Disruptor是基于事件异步驱动模型实现的,采用了RingBuffer数据结构,支持高并发、低延时、高吞吐量的高性能工作队列,它是由英国外汇交易公司LMAX开发的,研发的初衷是解决内存队列的延迟问题,不同于我们常用的分布式消息中间件RocketMQ、Kafaka,而Disruptor是单机的、本地内存队列,类似JDK的ArrayBlockingQueue等队列。

Disruptor的使用场景

  • 加密货币交易撮合引擎
  • Log4j2基于Disruptor实现的异步日志处理
  • Canal+Disruptor实现高效的数据同步
  • 知名开源框架Apache Strom

2010年在QCon的演讲,介绍了基于Disruptor开发的系统单线程能支撑每秒600万订单,由此可见该组件可以大幅提升系统的TPS,所以对于一些需要大幅提升单机应用的吞吐量的场景可以考虑使用Disruptor。

Disruptor和ArrayBlockingQueue性能对比

  • ArrayBlockingQueue是基于数组ArrayList实现的,通过ReentrantLock独占锁保证线程安全;
  • Disruptor是基于环形数组队列RingBuffer实现的,通过CAS乐观锁保证线程安全。在多种生产者-消费者模式下的性能对比。

Figure 1. Unicast: 1P–1C

02.jpg

Figure 2. Three Step Pipeline: 1P–3C

03.jpg

Figure 3. Sequencer: 3P–1C

04.jpg

Figure 4. Multicast: 1P–3C

05.jpg

Figure 5. Diamond: 1P–3C

06.jpg

Disruptor快速接入指南

引入Maven依赖
<dependency>

    <groupld>com.lmax</groupld>

    <artifactld>disruptor</artifactld>

    <version>4.0.0</version>

</dependency>
自定义事件和事件工厂
public class LongEvent {
    private long value;

    public void set(long value) {
        this.value = value;
    }

    @Override
    public String toString() {
        return "LongEvent{" + "value=" + value + '}';
    }
}

public class LongEventFactory implements EventFactory<LongEvent> {
    @Override
    public LongEvent newInstance() {
        return new LongEvent();
    }
}
定义事件处理器,即消费者
public class LongEventHandler implements EventHandler<LongEvent> {
    @Override
    public void onEvent(LongEvent event, long sequence, boolean endOfBatch) {
        System.out.println("Event: " + event);
    }
}
定义事件生产者
import com.lmax.disruptor.RingBuffer;
import com.lmax.disruptor.examples.longevent.LongEvent;

import java.nio.ByteBuffer;

public class LongEventProducer {
    private final RingBuffer<LongEvent> ringBuffer;

    public LongEventProducer(RingBuffer<LongEvent> ringBuffer) {
        this.ringBuffer = ringBuffer;
    }

    public void onData(ByteBuffer bb) {
        long sequence = ringBuffer.next(); 
        try {
            LongEvent event = ringBuffer.get(sequence); 
            event.set(bb.getLong(0));  
        }
        finally {
            ringBuffer.publish(sequence);
        }
    }
}
编写启动类
public class LongEventMain {
    public static void main(String[] args) throws InterruptedException {
        // 消费者线程池
        Executor executor = Executors.newCachedThreadPool();
        // 事件工厂
        LongEventFactory eventFactory = new LongEventFactory();
        // 指定RingBuffer大小
        int bufferSize = 1024;
        // 构造事件分发器
        Disruptor<LongEvent> disruptor = new Disruptor<>(eventFactory
                , bufferSize
                , executor
                , ProducerType.SINGLE // 1.ProducerType.SINGLE 单生产者模式 2.ProducerType.MULTI 多生产者模式
                , new YieldingWaitStrategy());//消费者等待策略
        // 注册消费者
        disruptor.handleEventsWith(new LongEventHandler());
        // 启动事件分发
        disruptor.start();
        // 获取RingBuffer 用于生产事件
        RingBuffer<LongEvent> ringBuffer = disruptor.getRingBuffer();
        LongEventProducer producer = new LongEventProducer(ringBuffer);
        ByteBuffer bb = ByteBuffer.allocate(8);
        for (long i=0;true; i++) {
            bb.putLong(0, i);
            // 发送事件
            producer.onData(bb);
            Thread.sleep(1000);
        }
    }
}

Disruptor消费者等待策略

等待策略WaitStrategy是一种决定一个消费者如何等待生产者将ev

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值