Java工具篇之Disruptor高性能队列
2022/8/25 1:24:26
本文主要是介绍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/ 本文为阿里云原创内容,未经允许不得转载。
这篇关于Java工具篇之Disruptor高性能队列的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-13TiDB + ES:转转业财系统亿级数据存储优化实践
- 2024-05-09“2024鸿蒙零基础快速实战-仿抖音App开发(ArkTS版)”实战课程已上线
- 2024-05-09聊聊如何通过arthas-tunnel-server来远程管理所有需要arthas监控的应用
- 2024-05-09log4j2这么配就对了
- 2024-05-09nginx修改Content-Type
- 2024-05-09Redis多数据源,看这篇就够了
- 2024-05-09Google Chrome驱动程序 124.0.6367.62(正式版本)去哪下载?
- 2024-05-09有没有大佬知道这种数据应该怎么抓取呀?
- 2024-05-09这种运行结果里的10.100000001,怎么能最快改成10.1?
- 2024-05-09企业src漏洞挖掘-有意思的命令执行