Spring集成高性能队列Disruptor
Disruptor简介
Disruptor(中文翻译为“破坏者”或“颠覆者”)是一种高性能、低延迟的并发编程框架,最初由LMAX Exchange开发。它的主要目标是解决在金融交易系统等需要高吞吐量和低延迟的应用中的并发问题。
Disruptor特点
-
无锁并发:Disruptor基于无锁的数据结构,它允许多个线程并发地读取和写入数据,而无需使用传统锁定机制,从而避免锁定的竞争和性能瓶颈。
-
环形缓冲区:Disruptor使用一个环形缓冲区,将数据项存储在其中。这个环形缓冲区可以通过预分配的方式来减少内存分配和垃圾回收的开销。
-
事件驱动:Disruptor的核心思想是将数据项(事件)从生产者传递到消费者,通过一种发布-订阅的模型来实现。生产者将事件写入缓冲区,而消费者从缓冲区中读取事件进行处理。
-
高性能:Disruptor专注于提供极高的吞吐量和低延迟,适用于需要快速处理大量数据的应用,如金融交易系统、网络数据传输等。
-
易于使用:尽管Disruptor的内部实现复杂,但它提供了简单而清晰的API,使开发人员能够相对容易地集成和使用它。
-
并发编程的辅助工具:Disruptor不仅仅是一个并发编程框架,还提供了一些辅助工具,如事件处理器、工作池等,帮助开发者更好地处理并发任务。
Disruptor应用
Disruptor可以理解为一个可以集成在项目里的MQ,它主要也分为了生产者,消息队列和消费者这么几部分,接下来用一个例子演示
引进依赖
<dependency><groupId>com.lmax</groupId><artifactId>disruptor</artifactId><version>3.4.2</version>
</dependency>
定义监听实体
@Data
public class DisruptorEvent {/*** 定义加入队列的时间毫秒值*/private long creatTime;/*** 携带的其他信息*/private String data;}
定义消费者
实现EventHandler接口,重写onEvent方法
@Slf4j
public class DisruptorConsumer implements EventHandler<DisruptorEvent> {@Overridepublic void onEvent(DisruptorEvent disruptorEvent, long l, boolean b) throws Exception {log.debug("消费者开始消费数据:[{}]", disruptorEvent);//模拟复杂环境下系统延迟Thread.sleep(1100);}
}
初始化Disruptor
由于我们后续还要用到这个对象,所以要把他交给IOC容器来管理,定义bean名称,避免后续有多个Disruptor对象
@Configuration
public class DisruptorConfig {/*** 队列长度,注意必须是2的n次幂*/private static final int RING_BUFFER_SIZE = 1024;@Bean(name = "cardDisruptor")public Disruptor<DisruptorEvent> disruptorStart() {DisruptorConsumer consumer = new DisruptorConsumer();Disruptor<DisruptorEvent> disruptor = new Disruptor<>(DisruptorEvent::new,RING_BUFFER_SIZE,Executors.defaultThreadFactory(),ProducerType.MULTI,new BlockingWaitStrategy());disruptor.handleEventsWith(consumer);disruptor.start();return disruptor;}
}
定义生产者
@Slf4j
public class DisruptorProducer {private static Disruptor<DisruptorEvent> disruptor;public DisruptorProducer(Disruptor<DisruptorEvent> disruptor) {DisruptorProducer.disruptor = disruptor;}public static void push(DisruptorEvent disruptorEvent) {//获取队列RingBuffer<DisruptorEvent> ringBuffer = disruptor.getRingBuffer();boolean flag = ringBuffer.tryPublishEvent(new EventTranslator<DisruptorEvent>() {@Overridepublic void translateTo(DisruptorEvent event, long l) {//这里一定要写成这种set的形式(也就是说不要改变这个event的内存指向地址),不然消费者会拿不到值event.setData(disruptorEvent.getData());event.setCreatTime(disruptorEvent.getCreatTime());}});if (!flag) {throw new RuntimeException("发送消息失败!");}}
}
测试
使用postman模拟并发10次
public void test() {DisruptorEvent event = new DisruptorEvent();event.setData("哈哈哈");event.setCreatTime(System.currentTimeMillis());DisruptorProducer.push(event);log.info("请求成功");}

相关文章:
Spring集成高性能队列Disruptor
Disruptor简介 Disruptor(中文翻译为“破坏者”或“颠覆者”)是一种高性能、低延迟的并发编程框架,最初由LMAX Exchange开发。它的主要目标是解决在金融交易系统等需要高吞吐量和低延迟的应用中的并发问题。 Disruptor特点 无锁并发&#x…...
C++——类和对象(中)完结
赋值运算符重载 运算符重载 C 为了增强代码的可读性引入了运算符重载 , 运算符重载是具有特殊函数名的函数 ,也具有其 返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。 函数名字为:关键…...
Sqoop的安装和使用
目录 一.安装 二.导入 1.全量导入 一.MySQL导入HDFS 二.MySQL导入Hive 2.增量导入 一.过滤导入hdfs/hive 二.导出 一.安装 1.下载地址:sqoop下载地址 2.解压 tar -zxvf ./sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz -C ../module/ 3.改名和配置归属权限 #改名…...
java毕业设计基于springboot+vue的村委会管理系统
项目介绍 采用JAVA语言,结合SpringBoot框架与Vue框架以及MYSQL数据库设计并实现的。本村委会管理系统主要包括个人中心、村民管理、村委会管理、村民信息管理、土地变更管理、农业补贴管理、党员信息管理等多个模块。它帮助村委会管理实现了信息化、网络化…...
【C++】多态 ⑪ ( 纯虚函数和抽象类 | 纯虚函数语法 | 抽象类和实现 | 代码示例 )
文章目录 一、纯虚函数和抽象类1、纯虚函数2、纯虚函数语法3、抽象类和实现 二、完整代码示例 一、纯虚函数和抽象类 1、纯虚函数 纯虚函数 : 在 C 语言中 , " 纯虚函数 " 是 特殊类型的 虚函数 , " 纯虚函数 " 在 父类 中 声明 , 但是没有实现 ; 抽象类 …...
node 第十四天 基于express的第三方中间件multer node后端处理用户上传文件
Multer 是一个 node.js 中间件,用于处理multipart/form-data 类型的表单数据,它主要用于上传文件。它是写在 busboy 之上的所以非常高效。前面我们已经知道了怎样利用express提供的静态资源处理中间件express.static()处理用户请求静态资源文件(图片, js…...
KnowledgeGPT:利用检索和存储访问知识库上增强大型语言模型10.30
利用检索和存储访问知识库上增强大型语言模型 摘要引言2 相关研究3方法3.1 任务定义3.2 知识检索3.2.1 代码实现3.2.2 实体链接3.2.3 获取实体信息3.2.4 查找实体或值3.2.5 查找关系 3.3 知识存储 4 实验4.1 实验设置4.2 流行知识库上的查询4.3 基于知识的问题回答 摘要 大型语…...
Angular material Chips Autocomplete
Chips Autocomplete 官网的例子我没法正常使用,无法实现搜索 我的select是个通用组件,现在贴代码: component.ts import {Component,ElementRef,forwardRef,Input,OnChanges,OnDestroy,OnInit,SimpleChanges,ViewChild, } from angular/co…...
『亚马逊云科技产品测评』活动征文|搭建基础运维环境
授权声明:本篇文章授权活动官方亚马逊云科技文章转发、改写权,包括不限于在 Developer Centre, 知乎,自媒体平台,第三方开发者媒体等亚马逊云科技官方渠道 目录 1、什么是容器化部署 2、连接到控制台 3、安装docker 3.1 更新…...
双指针扫描
import os import sys# 请在此输入您的代码 sinput() Alist(s) nlen(A) t1 for i in range(n//2):if A[i]!A[n-1-i]:t0break if t1:print(Y) else:print(N)n,smap(int,input().split()) alist(map(int,input().split())) #尺取法,变O(n*n)为O(n) #维护一个最短的区间…...
uniapp小程序九宫格抽奖
定义好奖品下标,计时器开始抽奖,请求接口,出现中奖奖品之后,获取中奖商品对应的奖品下标,再次计时器判断当前移动的小标是否为中奖商品的下标,并且是否转到3圈(防止转1圈就停止)&…...
mysql树状结构查询及注意事项
一、说明 由于Mysql不像oracle一样支持树状查询,需要用户自行处理,本文记录了一种常见的通过自定义函数的方式进行mysql树状查询的方法,以及使用的注意事项。 二、函数 CREATE DEFINERrootlocalhost FUNCTION get_child_menus(in_pid varc…...
TimeGPT-1——第一个时间序列数据领域的大模型他来了
一直有一个问题:时间序列的基础模型能像自然语言处理那样存在吗?一个预先训练了大量时间序列数据的大型模型,是否有可能在未见过的数据上产生准确的预测?最近刚刚发表的一篇论文,Azul Garza和Max Mergenthaler-Canseco提出的TimeGPT-1,将ll…...
通过Google搜索广告传送的携带木马的PyCharm软件版本
导语 最近,一起新的恶意广告活动被发现,利用被入侵的网站通过Google搜索结果推广虚假版本的PyCharm软件。这个活动利用了动态搜索广告,将广告链接指向被黑客篡改的网页,用户点击链接后下载的并不是PyCharm软件,而是多种…...
网站文章收录因素,别人复制文章排名比你原创的好?
我经常看到有站长抱怨“网站不收录”,“排名不好”,“复制的文章为什么秒收”之类的问题。对于SEO从业者来说,这确实是一个打击,认为搜索引擎不公平。凭什么自己原创不收录,别人复制去了,秒收他的ÿ…...
C#开源的一个能利用Windows通知栏背单词的软件 - ToastFish
前言 今天给大家推荐一个C#开源且免费的能利用Windows通知栏背单词的软件,可以让你在上班、上课等恶劣环境下安全隐蔽地背单词(利用摸鱼时间背单词的软件):ToastFish。 操作系统要求 目前该软件只支持Windows10及以上系统&…...
速拿offer,超全自动化测试面试题+答案汇总,背完还怕拿不到offer?
目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 1、你会封装自动化…...
LeetCode----1415. 长度为 n 的开心字符串中字典序第 k 小的字符串
题目 一个 「开心字符串」定义为: 仅包含小写字母 [‘a’, ‘b’, ‘c’].对所有在 1 到 s.length - 1 之间的 i ,满足 s[i] != s[i + 1] (字符串的下标从 1 开始)。比方说,字符串 “abc”,“ac”,“b” 和 “abcbabcbcb” 都是开心字符串,但是 “aa”,“baa” 和 “a…...
2310C++协程超传服务器
原文 告别异步回调模型,写代码更简单.同样也是跨平台,仅头文件的,包含头文件即可用,来看看它的用法. 基本用法 提供getpost服务 coro_http_server server(1, 9001);server.set_http_handler<GET, POST>("/", [](coro_http_request &req, coro_http_respo…...
【排序算法】 计数排序(非比较排序)详解!了解哈希思想!
🎥 屿小夏 : 个人主页 🔥个人专栏 : 算法—排序篇 🌄 莫道桑榆晚,为霞尚满天! 文章目录 📑前言🌤️计数排序的概念☁️什么是计数排序?☁️计数排序思想⭐绝对…...
QtScrcpy完全指南:从多设备控制到游戏键位映射的全方位应用
QtScrcpy完全指南:从多设备控制到游戏键位映射的全方位应用 【免费下载链接】QtScrcpy Android实时投屏软件,此应用程序提供USB(或通过TCP/IP)连接的Android设备的显示和控制。它不需要任何root访问权限 项目地址: https://gitcode.com/barry-ran/QtSc…...
5分钟搞定!Cesium/Leaflet/OpenLayers调用免费瓦片地图资源全攻略
三大地图框架快速调用免费瓦片资源实战指南 第一次接触GIS开发时,最让人头疼的莫过于地图底图资源的获取。作为项目的基础支撑,地图瓦片的质量和稳定性直接影响最终用户体验。但商业地图API往往价格不菲,对个人开发者和小型项目来说成本压力较…...
两行代码实现全自动网页翻译:translate.js 终极指南
两行代码实现全自动网页翻译:translate.js 终极指南 【免费下载链接】translate Two lines of js realize automatic html translation. No need to change the page, no language configuration file, no API key, SEO friendly! 项目地址: https://gitcode.com/…...
如何用FDS火灾动力学模拟器预知建筑火灾的致命威胁?5个关键步骤让你成为安全专家
如何用FDS火灾动力学模拟器预知建筑火灾的致命威胁?5个关键步骤让你成为安全专家 【免费下载链接】fds Fire Dynamics Simulator 项目地址: https://gitcode.com/gh_mirrors/fd/fds 想象一下,当火灾发生时,你能提前知道烟雾会如何扩散…...
YimMenu终极指南:GTA5免费辅助工具完整使用教程
YimMenu终极指南:GTA5免费辅助工具完整使用教程 【免费下载链接】YimMenu YimMenu, a GTA V menu protecting against a wide ranges of the public crashes and improving the overall experience. 项目地址: https://gitcode.com/GitHub_Trending/yi/YimMenu …...
最新变频恒压供水西门子s7-200梯形图程序组态王仿真设计 基于plc和组态王四泵恒压供水系统设计
最新变频恒压供水西门子s7-200梯形图程序组态王仿真设计 基于plc和组态王四泵恒压供水系统设计 (含西门子plc程序s7-200梯形图,组态王6.55仿真画面程序,plc虚拟仿真,两万字论文以及io分配,plc外部接线图)深夜的实验室里࿰…...
nli-distilroberta-base案例集锦:12个已落地NLI应用场景与技术实现要点
nli-distilroberta-base案例集锦:12个已落地NLI应用场景与技术实现要点 1. 项目概述 nli-distilroberta-base是一个基于DistilRoBERTa模型的自然语言推理(NLI)Web服务,专门用于判断两个句子之间的关系。这个轻量级但强大的模型能够快速准确地分析句子对…...
揭秘新篇!AI应用架构师的数据安全服务AI防护新思路
揭秘新篇!AI应用架构师的数据安全服务AI防护新思路 一、引言:AI时代的数据安全困局 当我们谈论AI应用时,数据是一切的核心——它是模型训练的“燃料”,是推理决策的“依据”,更是企业的核心资产。但随着AI技术的普及&a…...
GetQzonehistory:终极QQ空间说说备份完整指南
GetQzonehistory:终极QQ空间说说备份完整指南 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 在数字记忆时代,QQ空间承载了无数人的青春回忆。那些年发的说说、分…...
S2-Pro创意写作效果展示:多种文体与风格仿写
S2-Pro创意写作效果展示:多种文体与风格仿写 1. 开篇:当AI遇见创意写作 最近试用S2-Pro进行创意写作,结果让我这个老文案都感到惊艳。这款模型不仅能流畅生成各类文体,还能精准模仿名家风格,就像一位全能的文字魔术师…...
