首页 > 编程语言 >Java工具篇之Disruptor高性能队列

Java工具篇之Disruptor高性能队列

时间:2022-08-24 12:03:06浏览次数:93  
标签:Disruptor Java disruptor 队列 性能 线程 ArrayBlockingQueue

简介: 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/
本文为阿里云原创内容,未经允许不得转载。

标签:Disruptor,Java,disruptor,队列,性能,线程,ArrayBlockingQueue
From: https://www.cnblogs.com/yunqishequ/p/16619371.html

相关文章

  • java将html转成pdf
    需要的依赖:compile('org.xhtmlrenderer:flying-saucer-pdf:9.0.7')publicstaticvoidmain(String[]args)throwsFileNotFoundException{ try{ //图片是url或者b......
  • 【Java基础】面向对象的编程思想
    1.面向对象的编程思想做人的原则:不偷不抢不骗,这就是做人的思想编程的原则:....,这就是编程的思想2.面向过程和面向对象二者都是一种思想。(1)面向过程(POP)强调的是功能......
  • 力扣429(java)-构造矩形(简单)
    题目:作为一位web开发者,懂得怎样去规划一个页面的尺寸是很重要的。所以,现给定一个具体的矩形页面面积,你的任务是设计一个长度为L和宽度为W且满足以下要求的矩形的页......
  • java通过模板生成word文档
    工具库:https://github.com/Sayi/poi-tl中文文档:http://deepoove.com/poi-tl/pom依赖<dependency><groupId>com.deepoove</groupId><artifactId>poi-tl</artif......
  • PerfView专题 (第十篇):洞察 C# 终结队列引发的内存泄漏
    一:背景C#程序内存泄漏的诱发因素有很多,但从顶层原理上来说,就是该销毁的用户根对象没有被销毁,从而导致内存中意料之外的对象无限堆积,导致内存暴涨,最终崩溃,这其中的一个......
  • 深入理解Java中的Thread.sleep
    Thread.sleep()方法能够已毫秒为时间单位暂停当前执行的线程,参数值为毫秒不能为负数,否则将抛出IllegalArgumentException异常。Java线程休眠要点:1.它总是暂停当前执行的......
  • 36. Redis---Java使用Redis
    1.前言在开始学习本节内容之前,首先需要您掌握Java编程语言,其次确定您已经安装了Redis服务及JavaRedis驱动,并且能够成功运行Java程序。本节介绍如何在Java中......
  • Blog粘贴图片自动上传到服务器(Java版)
    ​项目需求可发布文章需求涉及到富文本编辑器经过查阅我选择了较为简便不需要后端支持可独立完成的tinymce框架官方文档也是相当完整虽然都是全英文但是有强大的谷......
  • Java-Java集合流操作
    List分组List去重1、单字段去重2、多字段去重List交集方法retainAllList分组去重获取最新记录List分组去重获取最新记录修订记录版本是否发布202......
  • Java-List集合字段求和函数
    一、FunctionCustom通用求和函数使用示例二、求和函数修订记录版本是否发布2020-01-25v1.0是一、FunctionCustom通用求和函数使用示例特点:简化代码......