乐趣区

关于后端:Java工具篇之Disruptor高性能队列

简介:disruptor 实用于多个线程之间的音讯队列, 作用与 ArrayBlockingQueue 有相似之处 ,然而 disruptor 从性能、性能都远好于 ArrayBlockingQueue,当多个线程之间传递大量数据或对性能要求较高时,能够思考应用 disruptor 作为 ArrayBlockingQueue 的替代者。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 详解伪共享概念三、如何应用 <dependency>

        <groupId>com.lmax</groupId>
        <artifactId>disruptor</artifactId>
        <version>3.4.2</version>
    </dependency>3.1 定义 Disruptor        // 指定 RingBuffer 大小,
    // 必须是 2 的 N 次方
    int bufferSize = 1024;

    // 构建 Disruptor
    Disruptor<LongEvent> disruptor
            = new Disruptor<>(
            LongEvent::new,
            bufferSize,
            DaemonThreadFactory.INSTANCE);3.2 定义事件处理器        // 注册事件处理器
    disruptor.handleEventsWith((event, sequence, endOfBatch) ->
                    System.out.println("E:" + event));3.3 生产数据        // 启动 Disruptor
    disruptor.start();

    // 获取 RingBuffer
    RingBuffer<LongEvent> ringBuffer
            = disruptor.getRingBuffer();
    // 生产 Event
    ByteBuffer bb = ByteBuffer.allocate(8);
    for (long l = 0; l < 10; l++) {bb.putLong(0, l);
        // 生产者生产音讯
        ringBuffer.publishEvent((event, sequence, buffer) ->
                        event.setValue(buffer.getLong(0)), bb);
    } 原文链接:https://click.aliyun.com/m/1000354797/ 本文为阿里云原创内容,未经容许不得转载。
退出移动版