当前位置: 首页 > news >正文

【开源项目】Disruptor框架介绍及快速入门

Disruptor框架简介

Disruptor框架内部核心的数据结构是Ring Buffer,Ring Buffer是一个环形的数组,Disruptor框架以Ring Buffer为核心实现了异步事件处理的高性能架构;JDK的BlockingQueue相信大家都用过,其是一个阻塞队列,内部通过锁机制实现生产者和消费者之间线程的同步。跟BlockingQueue一样,Disruptor框架也是围绕Ring Buffer实现生产者和消费者之间数据的交换,只不过Disruptor框架性能更高,笔者曾经在同样的环境下拿Disruptor框架跟ArrayBlockingQueue做过性能测试,Disruptor框架处理数据的性能比ArrayBlockingQueue的快几倍。

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

  1. 预加载内存可以理解为使用了内存池;
  2. 无锁化
  3. 单线程写
  4. 消除伪共享
  5. 使用内存屏障
  6. 序号栅栏机制

相关概念

  • 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来生产数据。

快速入门

MQManager启用Disruptor,返回RingBuffer实例。

@Configuration
public class MQManager {@Bean("messageModel")public RingBuffer<MessageModel> messageModelRingBuffer() {//定义用于事件处理的线程池, Disruptor通过java.util.concurrent.ExecutorSerivce提供的线程来触发consumer的事件处理  ExecutorService executor = Executors.newFixedThreadPool(2);//指定事件工厂  HelloEventFactory factory = new HelloEventFactory();//指定ringbuffer字节大小,必须为2的N次方(能将求模运算转为位运算提高效率),否则将影响效率  int bufferSize = 1024 * 256;//单线程模式,获取额外的性能  Disruptor<MessageModel> disruptor = new Disruptor<>(factory, bufferSize, executor,ProducerType.SINGLE, new BlockingWaitStrategy());//设置事件业务处理器---消费者  disruptor.handleEventsWith(new HelloEventHandler());// 启动disruptor线程  disruptor.start();//获取ringbuffer环,用于接取生产者生产的事件  RingBuffer<MessageModel> ringBuffer = disruptor.getRingBuffer();return ringBuffer;}
}

MessageModel消息实体类

@Data
public class MessageModel {  private String message;  
}

工厂类

public class HelloEventFactory implements EventFactory<MessageModel> {@Override  public MessageModel newInstance() {  return new MessageModel();  }  
}  

消息处理器

@Slf4j
public class HelloEventHandler implements EventHandler<MessageModel> {@Override  public void onEvent(MessageModel event, long sequence, boolean endOfBatch) {  try {  log.info("消费者处理消息开始");  if (event != null) {  log.info("消费者消费的信息是:{}",event);  }  } catch (Exception e) {  log.info("消费者处理消息失败");  }  log.info("消费者处理消息结束");  }  
}  

消息发送

@Slf4j
@Service
public class DisruptorMqServiceImpl implements DisruptorMqService {  @Autowiredprivate RingBuffer<MessageModel> messageModelRingBuffer;@Override  public void sayHelloMq(String message) {  log.info("record the message: {}",message);  //获取下一个Event槽的下标  long sequence = messageModelRingBuffer.next();  try {  //给Event填充数据  MessageModel event = messageModelRingBuffer.get(sequence);  event.setMessage(message);  log.info("往消息队列中添加消息:{}", event);  } catch (Exception e) {  log.error("failed to add event to messageModelRingBuffer for : e = {},{}",e,e.getMessage());  } finally {  //发布Event,激活观察者去消费,将sequence传递给改消费者  //注意最后的publish方法必须放在finally中以确保必须得到调用;如果某个请求的sequence未被提交将会堵塞后续的发布操作或者其他的producer  messageModelRingBuffer.publish(sequence);  }  }  
} 

在这里插入图片描述

相关文章:

【开源项目】Disruptor框架介绍及快速入门

Disruptor框架简介 Disruptor框架内部核心的数据结构是Ring Buffer&#xff0c;Ring Buffer是一个环形的数组&#xff0c;Disruptor框架以Ring Buffer为核心实现了异步事件处理的高性能架构&#xff1b;JDK的BlockingQueue相信大家都用过&#xff0c;其是一个阻塞队列&#xf…...

双向链表实现约瑟夫问题

title: 双向链表实现约瑟夫问题 date: 2023-05-16 11:42:26 tags: **问题&#xff1a;**知n个人围坐在一张圆桌周围。从编号为k的人开始报数&#xff0c;数到m的那个人出列&#xff1b;他的下一个人又从1开始报数&#xff0c;数到m的那个人又出列&#xff1b;依此规律重复下去&…...

日心说为人类正确认识宇宙打下了基础(善用工具的重要性)

文章目录 引言I 伽利略1.1 借助天文望远镜获得了比别人更多的信息。1.2 确定了科学研究方法&#xff1a;实验和观测 II 开普勒三定律 引言 享有科学史上崇高地位的人&#xff0c;都需要在构建科学体系上有重大贡献。 日心说在哥白尼那里还是一个假说&#xff0c;伽利略拿事实…...

Kali-linux系统指纹识别

现在一些便携式计算机操作系统使用指纹识别来验证密码进行登录。指纹识别是识别系统的一个典型模式&#xff0c;包括指纹图像获取、处理、特征提取和对等模块。如果要做渗透测试&#xff0c;需要了解要渗透测试的操作系统的类型才可以。本节将介绍使用Nmap工具测试正在运行的主…...

Java版本电子招标采购系统源码:营造全面规范安全的电子招投标环境,促进招投标市场健康可持续发展

营造全面规范安全的电子招投标环境&#xff0c;促进招投标市场健康可持续发展 传统采购模式面临的挑战 一、立项管理 1、招标立项申请 功能点&#xff1a;招标类项目立项申请入口&#xff0c;用户可以保存为草稿&#xff0c;提交。 2、非招标立项申请 功能点&#xff1a;非招标…...

Java字符串知多少:String、StringBuffer、StringBuilder

一、String 1、简介 String 是 Java 中使用得最频繁的一个类了&#xff0c;不管是作为开发者的业务使用&#xff0c;还是一些系统级别的字符使用&#xff0c; String 都发挥着重要的作用。String 是不可变的、final的&#xff0c;不能被继承&#xff0c;且 Java 在运行时也保…...

中国20强(上市)游戏公司2022年财报分析:营收结构优化,市场竞争进入白热化

易观&#xff1a;受全球经济增速下行的消极影响&#xff0c;2022年国内外游戏市场规模普遍下滑。但中国游戏公司凭借处于全球领先水平的研发、发行和运营的能力与经验&#xff0c;继续加大海外市场布局&#xff0c;推动高质量发展迈上新台阶。 风险提示&#xff1a;本文内容仅代…...

如何自学C++编程语言,聊聊C++的特点,别轻易踩坑

为什么现在有那么多C培训班呢&#xff1f;因为这些培训班可以为学生安排工作&#xff0c;而外包公司因为缺人&#xff0c;需要做很多项目&#xff0c;可能需要在全国各地分配不同的程序员去干不同的项目&#xff0c;因此需要大量的程序员入职。这样&#xff0c;外包公司就会找培…...

算法Day07 | 454.四数相加II,383. 赎金信,15. 三数之和, 18. 四数之和

Day07 454.四数相加II383. 赎金信15. 三数之和18. 四数之和 454.四数相加II 题目链接&#xff1a;454.四数相加II 寻找两个数组之和&#xff0c;是否与另外两个数组之和有特定的关系。 因为数值可能跨度太大&#xff0c;选择使用下标表示为对应的数值大小&#xff0c;会很浪费…...

ps抠图、抠头发去背景等

方法一&#xff1a;背景橡皮擦 一、很早之前我们使用的是魔术棒工具&#xff0c;但现在我们可以使用Photoshop 有内置的“背景橡皮擦” 步骤&#xff1a; 第1步&#xff1a;在Photoshop中打开需要修的图。 第2步&#xff1a;单击并按住工具栏…...

计算机组成原理基础练习题第一章

有些计算机将一部分软件永恒地存于只读存储器中&#xff0c;称之为&#xff08;&#xff09; A.硬件    B.软件C.固件    D.辅助存储器输入、输出装置以及外界的辅助存储器称为&#xff08;&#xff09; A.操作系统    B.存储器 C.主机      D.外围设备完整的计算机系…...

[PyTorch][chapter 34][池化层与采样]

前言&#xff1a; 这里主要讲解一下卷积神经网络中的池化层与采样 目录 DownSampleMax poolingavg poolingupsampleReLu 1&#xff1a; DownSample 下采样,间隔一定行或者列进行采样&#xff0c;达到降维效果 早期LeNet-5 就采样该采样方式。 LeNet-5 2 Max pooling 最大值采样…...

Java进阶-字符串的使用

1.API 1.1API概述 什么是API ​ API (Application Programming Interface) &#xff1a;应用程序编程接口 java中的API ​ 指的就是 JDK 中提供的各种功能的 Java类&#xff0c;这些类将底层的实现封装了起来&#xff0c;我们不需要关心这些类是如何实现的&#xff0c;只需要…...

接口自动化框架对比 | 质量工程

一、前言 自动化测试是把将手工驱动的测试行为转化为机器自动执行&#xff0c;通常操作是在某一框架下进行代码编写&#xff0c;实现用例自动发现与执行&#xff0c;托管在CI/CD平台上&#xff0c;通过条件触发或手工触发&#xff0c;进行回归测试&线上监控&#xff0c;代替…...

谷歌浏览器network error解决方法

很多用户在使用谷歌浏览器时候会出现network error网页提示&#xff0c;很多用户不知道该如何处理这一问题&#xff0c;其实解决方法不止一种&#xff0c;小编整理了两种谷歌浏览器network error解决方法&#xff0c;一起来看看吧~ 谷歌浏览器network error解决方法&#xff1…...

自动化测试如何做?接口自动化测试框架必备的9个功能,测试老鸟总结...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 当你准备使用一个…...

ANR原理篇 - ANR原理总览

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 例如&#xff1a;第一章 Python 机器学习入门之pandas的使用 文章目录 系列文章目录前言ANR流程概览ANR触发机制一、service超时机制二、broadcast超时机制三、provider超…...

新版Mamba体验超快的软件安装

在一文掌握Conda软件安装&#xff1a;虚拟环境、软件通道、加速solving、跨服务器迁移中详细介绍的conda的基本使用和遇到问题的解决方式&#xff0c;也提到了mamba作为一个替代工具&#xff0c;可以很好的加速conda的solving environemnt过程。但有时也会遇到一个很尴尬的问题…...

LDAP配置与安装

LDAP配置与安装 一、安装LDAP1、安装OpenLDAP及相关依赖包2、查看OpenLDAP版本3、配置OpenLDAP数据库4、设置OpenLDAP的管理员密码5、修改配置文件5.1. 修改{2}hdb.ldif文件5.2. 修改{1}monitor.ldif文件5.3. 修改{-1}frontend.ldif文件 6、验证LDAP的基本配置7、修改LDAP文件权…...

1-Linux环境安装JDK

Linux环境安装JDK 准备&#xff1a; ① Linux 环境 本文中Linux环境为 CentOS Linux 7 可使用以下命令查询 linux 系统版本&#xff1a; hostnamectl② 准备JDK包 进入官网 https://www.oracle.com/java/technologies/downloads/#java17下载对应jdk包 此处使用以前下载的旧…...

通胀数据回落助金价小幅回升

现货黄金窄幅震荡&#xff0c;目前交投于2032.92美元/盎司附近。隔夜美国通胀数据弱于市场预期&#xff0c;市场对美联储6月份加息预期降温&#xff0c;美元指数走弱&#xff0c;金价一度冲高至2050关口附近&#xff0c;不过&#xff0c;随后金价回吐全部涨幅&#xff0c;并一度…...

正则表达式的基本语法以及技巧和示例

正则表达式&#xff08;Regular Expression&#xff09;是一种强大的文本模式匹配工具&#xff0c;它使用特定的语法规则来描述和匹配字符串。在实际应用中&#xff0c;正则表达式可以用于搜索、替换、验证和分割文本数据。本文将详细解释正则表达式的语法和常用的使用示例。 …...

蓝牙耳机怎么挑选?小编分享2023畅销蓝牙耳机排行榜

蓝牙耳机怎么挑选&#xff1f;蓝牙、音质、续航、佩戴是蓝牙耳机选购时最重要的四大维度&#xff0c;这几年随着技术的成熟体验有了很大改善&#xff0c;但挑选的时候仍然要仔细对比&#xff0c;不然容易踩雷。小编根据销量整理了蓝牙耳机排行榜&#xff0c;一起看看最受消费者…...

Linux快照太有趣了!

1.首先介绍一下什么是Linux快照 VMware 的菜单栏中有虚拟机快照这个选项&#xff0c;形象来说快照就相当于一个备份文件&#xff0c;记录的是虚拟机运行到某一节点时的状态&#xff0c;在虚拟机的使用过程中如果发生了意外&#xff0c;比如系统崩溃或系统异常&#xff0c;此时…...

【改进粒子群优化算法】自适应惯性权重粒子群算法(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

ROS 下 激光扫描仪 YDLidar-G4 使用

环境配置&#xff1a; ubuntu20.04 LTS ROS noetic 编程工具&#xff1a;vs code&#xff0c;远程通过ssh访问 扫描仪&#xff1a;YDLidar-G4 YDLidar驱动&#xff1a; YDLidar SDK YDLidar ROS 功能包 此环境包含树莓派&#xff0c;以下过程在树莓派3B上测试通过&#xff0c…...

智能边缘:数字化时代的关键战略之一

随着物联网、云计算和人工智能等技术的快速发展&#xff0c;智能边缘已经成为了许多企业和组织中的重要部分。智能边缘旨在将物联网设备、应用程序和数据存储集成到一个统一的、移动的计算环境中&#xff0c;以提高效率、降低成本并增强数据安全性。在本文中&#xff0c;我们将…...

EasyRecovery16中文最新版电脑数据恢复软件下载使用教程

EasyRecovery如果需要使用它来恢复数据&#xff0c;请注意&#xff0c;尤其是当需要恢复的数据文件非常重要时&#xff0c;建议使用软件EasyRecovery以保障数据安全。共有三个版本&#xff0c;分别是个人版、专业版、企业版&#xff0c;这三种都可以免费下载并使用&#xff0c;…...

什么是鉴权?这些postman鉴权方式你又知道多少?

一、什么是鉴权&#xff1f; 鉴权也就是身份认证&#xff0c;就是验证您是否有权限从服务器访问或操作相关数据。发送请求时&#xff0c;通常必须包含相应的检验参数以确保请求具有访问权限并返回所需数据。通俗的讲就是一个门禁&#xff0c;您想要进入室内&#xff0c;必须通过…...

最新的经典mysql面试题及答案

互联网产品必然是需要有架构的&#xff0c;架构包含接入层、储蓄层、逻辑处理等等&#xff0c;其中存储层承载着数据落地和持久化的任务&#xff0c;同时给逻辑处理层提供数据查询功能支持。而一提到储蓄层必然就要说数据库了&#xff0c;对于数据库的掌握也是软件工程师面试时…...