初识Disruptor框架
最近工作中参与了一个随机数分发平台的设计,考虑如何才能实现该平台的高并发性能,在技术实现选型中首先参考了百度的uid-generator,其采用了双
RingBuffer
的实现形式,估计uid-generator的双RingBuffer
也是借鉴了Disruptor的实现思想吧。因此,本系列文章我们一起来探究学习下2011年获得了Duke’s 程序框架创新奖的Disruptor
框架。
1 前言
Martin Fowler在自己网站上写了一篇LMAX架构的文章,LMAX是一种运行在JVM平台上的新型零售金融交易平台,该平台能够以很低的延迟产生大量交易,大量交易是多少呢?单个线程达到了每秒处理6百万订单的TPS,虽然业务逻辑是纯内存操作,但每秒处理6百万订单的TPS已经高的惊人了。那么,是什么支撑了LMAX单个线程能达到每秒处理6百万订单呢?答案就是Disruptor
。
Disruptor
是一个开源的并发框架,其于2011年获得了Duke’s 程序框架创新奖,采用事件源驱动方式,能够在无锁的情况下实现网络的Queue并发操作。
2 Disruptor框架简介
Disruptor
框架内部核心的数据结构是Ring Buffer
,Ring Buffer
是一个环形的数组,Disruptor
框架以Ring Buffer
为核心实现了异步事件处理的高性能架构;JDK的BlockingQueue
相信大家都用过,其是一个阻塞队列,内部通过锁机制实现生产者和消费者之间线程的同步。跟BlockingQueue
一样,Disruptor
框架也是围绕Ring Buffer
实现生产者和消费者之间数据的交换,只不过Disruptor
框架性能更高,笔者曾经在同样的环境下拿Disruptor
框架跟ArrayBlockingQueue
做过性能测试,Disruptor
框架处理数据的性能比ArrayBlockingQueue
的快几倍。
Disruptor
框架性能为什么会更好呢?其有以下特点:
预加载内存可以理解为使用了内存池;
无锁化
单线程写
消除伪共享
使用内存屏障
序号栅栏机制
3 相关概念
Disruptor:是使用Disruptor
框架的核心类,持有RingBuffer
、消费者线程池、消费者集合ConsumerRepository
和消费者异常处理器ExceptionHandler
等引用;
Ring Buffer: RingBuffer
处于Disruptor
框架的中心位置,其是一个环形数组,环形数组的对象采用预加载机制创建且能重用,是生产者和消费者之间交换数据的桥梁,其持有Sequencer
的引用;
Sequencer: Sequencer
是Disruptor
框架的核心,实现了所有并发算法,用于生产者和消费者之间快速、正确地传递数据,其有两个实现类SingleProducerSequencer
和MultiProducerSequencer
。
Sequence:Sequence
被用来标识Ring Buffer
和消费者Event Processor
的处理进度,每个消费者Event Processor
和Ring Buffer
本身都分别维护了一个Sequence
,支持并发操作和顺序写,其也通过填充缓存行的方式来消除伪共享从而提高性能。
Sequence Barrier:Sequence Barrier
即为序号屏障,通过追踪生产者的cursorSequence
和每个消费者( EventProcessor
)的sequence
的方式来协调生产者和消费者之间的数据交换进度,其实现类ProcessingSequenceBarrier
持有的WaitStrategy
等待策略类是实现序号屏障的核心。
Wait Strategy:Wait Strategy
是决定消费者如何等待生产者的策略方式,当消费者消费速度过快时,此时是不是要让消费者等待下,此时消费者等待是通过锁的方式实现还是无锁的方式实现呢?
Event Processor:Event Processor
可以理解为消费者线程,该线程会一直从Ring Buffer
获取数据来消费数据,其有两个核心实现类:BatchEventProcessor
和WorkProcessor
。
Event Handler:Event Handler
可以理解为消费者实现业务逻辑的Handler
,被BatchEventProcessor
类引用,在BatchEventProcessor
线程的死循环中不断从Ring Buffer
获取数据供Event Handler
消费。
Producer:生产者,一般用RingBuffer.publishEvent
来生产数据。
4 入门DEMO
// LongEvent.java
public class LongEvent
{private long value;public void set(long value){this.value = value;}public long get() {return this.value;}
}
// LongEventFactory.java
public class LongEventFactory implements EventFactory<LongEvent>
{@Overridepublic LongEvent newInstance(){return new LongEvent();}
}
// LongEventHandler.java
public class LongEventHandler implements EventHandler<LongEvent>
{@Overridepublic void onEvent(LongEvent event, long sequence, boolean endOfBatch){System.out.println(new Date() + ":Event-" + event.get());}
}
// LongEventTranslatorOneArg.java
public class LongEventTranslatorOneArg implements EventTranslatorOneArg<LongEvent, ByteBuffer> {@Overridepublic void translateTo(LongEvent event, long sequence, ByteBuffer buffer) {event.set(buffer.getLong(0));}
}
// LongEventMain.java
public class LongEventMain
{public static void main(String[] args) throws Exception{int bufferSize = 1024;final Disruptor<LongEvent> disruptor = new Disruptor<LongEvent>(new LongEventFactory(),bufferSize,Executors.newSingleThreadExecutor(),ProducerType.SINGLE,new YieldingWaitStrategy());disruptor.handleEventsWith(new LongEventHandler());disruptor.start();RingBuffer<LongEvent> ringBuffer = disruptor.getRingBuffer();ByteBuffer bb = ByteBuffer.allocate(8);for (long l = 0; true; l++){bb.putLong(0, l);ringBuffer.publishEvent(new LongEventTranslatorOneArg(), bb);Thread.sleep(1000);}}
}
输出结果:
参考:https://lmax-exchange.github.io/disruptor/user-guide/index.html
【源码笔记】Github地址:
https://github.com/yuanmabiji/Java-SourceCode-Blogs
初识Disruptor框架相关推荐
- Disruptor介绍 -- 初识Disruptor框架
Disruptor简介: LMAX Disruptor是一个高性能的线程间消息库.它源于LMAX对并发性,性能和非阻塞算法的研究,如今构成了Exchange基础架构的核心部分. Disruptor它是 ...
- 并发编程之Disruptor框架介绍和高阶运用
1. Disruptor是什么 1.1 技术背景 LMAX是在英国注册并受到FCA监管(监管号码为509778)的外汇黄金交易所, LMAX架构是LMAX内部研发并应用到交易系统的一种技术.它 ...
- 初识Django框架
文章目录 初识Django框架 python三大主流web框架介绍 Django框架介绍 Django基本操作 创建一个django项目 应用解释 主要文件介绍 命令行与pycharm创建的区别 dj ...
- Disruptor框架中生产者、消费者的各种复杂依赖场景下的使用总结-我见过最好的Disruptor
更多高并发知识请访问 www.itkc8.com 非常感谢 https://www.cnblogs.com/pku-liuqiang/p/8544700.html Disruptor是一个优秀的并发框 ...
- 初识JQuery框架的基本使用
初识JQuery框架的基本使用 本文内容大纲 //jquery不是语言 是js的框架 (方便简化javaScript开发:选择器.Css.Html.js动画.浏览器兼容.丰富插件) How怎么用? 使 ...
- disruptor框架为什么不流行_Java并发编程框架Disruptor
Disruptor是什么? Disruptor是一个高性能的异步处理框架,一个轻量级的JMS,和JDK中的BlockingQueue有相似处,但是它的处理速度非常快,获得2011年程序框架创新大奖,号 ...
- Java—Disruptor框架
文档结构 概念简介 概念简介 Disruptor它是一个开源的并发框架,并获得2011 Duke's 程序框架创新奖,能够在无锁的情况下实现网络的Queue并发操作. 学习网址:http://ifev ...
- java之初识集合框架
初识集合 什么叫集合框架
- 高性能并发队列Disruptor使用详解,详细解析Disruptor框架的应用和基本原理
基本概念 Disruptor是一个高性能的异步处理框架,是一个轻量的Java消息服务JMS, 能够在无锁的情况下实现队列的并发操作 Disruptor使用环形数组实现了类似队列的功能,并且是一个有界队 ...
最新文章
- 牛客网在线编程之“字符串分割”
- 【java项目实践】具体解释Ajax工作原理以及实现异步验证username是否存在+源代码下载(java版)...
- BZOJ-1082-[SCOI2005]栅栏(二分+dfs判定)
- linux的TCP连接数量最大不能超过65535个,那服务器是如何应对百万千万的并发的?
- 如何下载今日头条视频
- 模板:线段树优化建图
- python递归求13的n次方_Python题目:递归的简单题目,求阶乘,求n-m的累积和,求斐波那契...
- nlp-tutorial代码注释3-2,LSTM简介
- 这些话,是乔布斯给世间留下的真正伟大礼物
- 超声波及其传感器工作原理
- 一个美观的gridview样式
- gmsk仿真matlab,GMSK系统的建模与仿真MATLAB程序
- (Excel)常用函数公式及操作技巧之六:汇总计算与统计(一)
- php 微信公众号关注推送欢迎语
- asp.net 获取网页源文件的方法
- 工作记录(JS向textarea添加固定内容、通过固定字符将字符串分割为数组)
- OpenStack(Rocky)配置sFlow+floodlight实现简单SDN
- 高速信号线PCB走线中的阻抗匹配
- VIN码识别-汽修行业新技术
- mysql 触发器 模板_MySQL 触发器例子(两张表同步增加和删除)