最近工作中参与了一个随机数分发平台的设计,考虑如何才能实现该平台的高并发性能,在技术实现选型中首先参考了百度的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 BufferRing Buffer是一个环形的数组,Disruptor框架以Ring Buffer为核心实现了异步事件处理的高性能架构;JDK的BlockingQueue相信大家都用过,其是一个阻塞队列,内部通过锁机制实现生产者和消费者之间线程的同步。跟BlockingQueue一样,Disruptor框架也是围绕Ring Buffer实现生产者和消费者之间数据的交换,只不过Disruptor框架性能更高,笔者曾经在同样的环境下拿Disruptor框架跟ArrayBlockingQueue做过性能测试,Disruptor框架处理数据的性能比ArrayBlockingQueue的快几倍。

Disruptor框架性能为什么会更好呢?其有以下特点:

  1. 预加载内存可以理解为使用了内存池;

  2. 无锁化

  3. 单线程写

  4. 消除伪共享

  5. 使用内存屏障

  6. 序号栅栏机制

3 相关概念

image.png

Disruptor:是使用Disruptor框架的核心类,持有RingBuffer、消费者线程池、消费者集合ConsumerRepository和消费者异常处理器ExceptionHandler等引用;

Ring BufferRingBuffer处于Disruptor框架的中心位置,其是一个环形数组,环形数组的对象采用预加载机制创建且能重用,是生产者和消费者之间交换数据的桥梁,其持有Sequencer的引用;

SequencerSequencerDisruptor框架的核心,实现了所有并发算法,用于生产者和消费者之间快速、正确地传递数据,其有两个实现类SingleProducerSequencerMultiProducerSequencer

Sequence:Sequence被用来标识Ring Buffer和消费者Event Processor的处理进度,每个消费者Event ProcessorRing Buffer本身都分别维护了一个Sequence,支持并发操作和顺序写,其也通过填充缓存行的方式来消除伪共享从而提高性能。

Sequence Barrier:Sequence Barrier即为序号屏障,通过追踪生产者的cursorSequence和每个消费者( EventProcessor)的sequence的方式来协调生产者和消费者之间的数据交换进度,其实现类ProcessingSequenceBarrier持有的WaitStrategy等待策略类是实现序号屏障的核心。

Wait Strategy:Wait Strategy是决定消费者如何等待生产者的策略方式,当消费者消费速度过快时,此时是不是要让消费者等待下,此时消费者等待是通过锁的方式实现还是无锁的方式实现呢?

Event Processor:Event Processor可以理解为消费者线程,该线程会一直从Ring Buffer获取数据来消费数据,其有两个核心实现类:BatchEventProcessorWorkProcessor

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);}}
}

输出结果:

image.png

参考:https://lmax-exchange.github.io/disruptor/user-guide/index.html

【源码笔记】Github地址:

https://github.com/yuanmabiji/Java-SourceCode-Blogs

初识Disruptor框架相关推荐

  1. Disruptor介绍 -- 初识Disruptor框架

    Disruptor简介: LMAX Disruptor是一个高性能的线程间消息库.它源于LMAX对并发性,性能和非阻塞算法的研究,如今构成了Exchange基础架构的核心部分. Disruptor它是 ...

  2. 并发编程之Disruptor框架介绍和高阶运用

    1.   Disruptor是什么 1.1   技术背景 LMAX是在英国注册并受到FCA监管(监管号码为509778)的外汇黄金交易所, LMAX架构是LMAX内部研发并应用到交易系统的一种技术.它 ...

  3. 初识Django框架

    文章目录 初识Django框架 python三大主流web框架介绍 Django框架介绍 Django基本操作 创建一个django项目 应用解释 主要文件介绍 命令行与pycharm创建的区别 dj ...

  4. Disruptor框架中生产者、消费者的各种复杂依赖场景下的使用总结-我见过最好的Disruptor

    更多高并发知识请访问 www.itkc8.com 非常感谢 https://www.cnblogs.com/pku-liuqiang/p/8544700.html Disruptor是一个优秀的并发框 ...

  5. 初识JQuery框架的基本使用

    初识JQuery框架的基本使用 本文内容大纲 //jquery不是语言 是js的框架 (方便简化javaScript开发:选择器.Css.Html.js动画.浏览器兼容.丰富插件) How怎么用? 使 ...

  6. disruptor框架为什么不流行_Java并发编程框架Disruptor

    Disruptor是什么? Disruptor是一个高性能的异步处理框架,一个轻量级的JMS,和JDK中的BlockingQueue有相似处,但是它的处理速度非常快,获得2011年程序框架创新大奖,号 ...

  7. Java—Disruptor框架

    文档结构 概念简介 概念简介 Disruptor它是一个开源的并发框架,并获得2011 Duke's 程序框架创新奖,能够在无锁的情况下实现网络的Queue并发操作. 学习网址:http://ifev ...

  8. java之初识集合框架

    初识集合 什么叫集合框架

  9. 高性能并发队列Disruptor使用详解,详细解析Disruptor框架的应用和基本原理

    基本概念 Disruptor是一个高性能的异步处理框架,是一个轻量的Java消息服务JMS, 能够在无锁的情况下实现队列的并发操作 Disruptor使用环形数组实现了类似队列的功能,并且是一个有界队 ...

最新文章

  1. 牛客网在线编程之“字符串分割”
  2. 【java项目实践】具体解释Ajax工作原理以及实现异步验证username是否存在+源代码下载(java版)...
  3. BZOJ-1082-[SCOI2005]栅栏(二分+dfs判定)
  4. linux的TCP连接数量最大不能超过65535个,那服务器是如何应对百万千万的并发的?
  5. 如何下载今日头条视频
  6. 模板:线段树优化建图
  7. python递归求13的n次方_Python题目:递归的简单题目,求阶乘,求n-m的累积和,求斐波那契...
  8. nlp-tutorial代码注释3-2,LSTM简介
  9. 这些话,是乔布斯给世间留下的真正伟大礼物
  10. 超声波及其传感器工作原理
  11. 一个美观的gridview样式
  12. gmsk仿真matlab,GMSK系统的建模与仿真MATLAB程序
  13. (Excel)常用函数公式及操作技巧之六:汇总计算与统计(一)
  14. php 微信公众号关注推送欢迎语
  15. asp.net 获取网页源文件的方法
  16. 工作记录(JS向textarea添加固定内容、通过固定字符将字符串分割为数组)
  17. OpenStack(Rocky)配置sFlow+floodlight实现简单SDN
  18. 高速信号线PCB走线中的阻抗匹配
  19. VIN码识别-汽修行业新技术
  20. mysql 触发器 模板_MySQL 触发器例子(两张表同步增加和删除)

热门文章

  1. opencv-轮廓检测
  2. 计算机网络第七部分--因特网协议(英文版本)
  3. matlab在动态分析中的应用图,功率键合图和Matlab/Simulink在液压系统动态仿真分析中的应用...
  4. 关于各类3D游戏异常掉帧问题
  5. 矩形灯、区域灯光的公共参数详解
  6. APP测试技术:ADB——安卓手机测试一座神奇的“桥”
  7. 盲盒扭蛋机小程序-系统简介
  8. 操作系统实验——系统调用:获取当前进程pid和ppid
  9. 解锁优麒麟的隐藏快捷键玩法,效率UPUP
  10. k8s 添加 node