Spring集成高性能队列Disruptor

news2024/11/26 22:33:56

Disruptor简介

Disruptor(中文翻译为“破坏者”或“颠覆者”)是一种高性能、低延迟的并发编程框架,最初由LMAX Exchange开发。它的主要目标是解决在金融交易系统等需要高吞吐量和低延迟的应用中的并发问题。

Disruptor特点

  1. 无锁并发:Disruptor基于无锁的数据结构,它允许多个线程并发地读取和写入数据,而无需使用传统锁定机制,从而避免锁定的竞争和性能瓶颈。

  2. 环形缓冲区:Disruptor使用一个环形缓冲区,将数据项存储在其中。这个环形缓冲区可以通过预分配的方式来减少内存分配和垃圾回收的开销。

  3. 事件驱动:Disruptor的核心思想是将数据项(事件)从生产者传递到消费者,通过一种发布-订阅的模型来实现。生产者将事件写入缓冲区,而消费者从缓冲区中读取事件进行处理。

  4. 高性能:Disruptor专注于提供极高的吞吐量和低延迟,适用于需要快速处理大量数据的应用,如金融交易系统、网络数据传输等。

  5. 易于使用:尽管Disruptor的内部实现复杂,但它提供了简单而清晰的API,使开发人员能够相对容易地集成和使用它。

  6. 并发编程的辅助工具: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> {

    @Override
    public 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>() {
            @Override
            public 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("请求成功");
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1167073.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

kibana中文设置

安装目录下&#xff1a; 修改config/kibana.yml文件&#xff0c;添加如下配置 i18n.locale: "zh-CN"如图&#xff1a; 保存后&#xff0c;重启kibana即可

分组select获取每组用户最新时间的那条数据的查询方式

分组select获取每组用户最新时间的那条数据的查询方式,使用子查询内连接的方式实现 selecttp.user_id AS userId,tp.operator,DATE_FORMAT(tp.create_time,%Y-%m-%d %H:%i:%s) AS operateTimefrom 表名 t1 INNER JOIN(select user_id, max(create_time) max_time from 表名whe…

LeakCanary - Android的内存泄漏检测库

官网 GitHub - square/leakcanary: A memory leak detection library for Android. LeakCanary 项目简介 LeakCanary’s knowledge of the internals of the Android Framework gives it a unique ability to narrow down the cause of each leak, helping developers drama…

知识付费系统小程序开发中的最新趋势和技术是什么?

在迅速发展的移动应用市场中&#xff0c;知识付费系统小程序成为了在线学习和知识传递的重要形式。随着技术的不断进步&#xff0c;了解最新的趋势和技术对于开发知识付费系统小程序至关重要。本文将讨论当前在这一领域中备受关注的最新趋势和技术。 1. 跨平台开发框架的崛起…

赢在电商设计!2024年最新电商设计实战技巧盘点

双十一、双十二、黑五的电商大促即将轮番将至&#xff0c;电商运营人迎来大忙季&#xff0c;选品、直播、采购入库、售后……各种环节都是影响电商转化的关键因素&#xff0c;而电商设计作为打通这些环节&#xff0c;打造高转化率电商平台的关键要素&#xff0c;能够吸引用户注…

淘宝(PC端和APP端)商品详情API接口,可批量采集,高并发请求

淘宝&#xff08;PC端和APP端&#xff09;商品详情API接口&#xff0c;可批量采集&#xff0c;高并发请求代码如下&#xff1a; 淘宝商品详情API接口可以获取到商品的详细信息&#xff0c;以下是一个示例&#xff1a; 请求方式&#xff1a;使用HTTP或HTTPS协议&#xff0c;向指…

android studio安卓模拟器启动了但是看不到画面解决办法

当你使用android studio开发软件的时候&#xff0c;可能会遇到这个问题&#xff0c;就是当你点击下拉框中的启动模拟器的时候&#xff0c;看着程序是启动了&#xff0c;并且运行了&#xff0c;但是看不到模拟器界面&#xff0c;如下图&#xff1a; 这个时候&#xff0c;就要停止…

老年性聋不仅是听不到那么简单,如何避免让它来的更晚一些?

你是否有过这样的经历&#xff0c;和老年人聊天时&#xff0c;他们总是让你重复说话&#xff0c;或者说“你说话太小声了&#xff0c;我听不清楚”&#xff1f;这可能是老年性聋的一个信号。 据统计&#xff0c;老年性聋是全球老年人口中第二大常见疾病&#xff0c;也是全球第三…

【React】【react-globe.gl】3D Objects效果

目录 想要实现的效果实现过程踩坑安装依赖引入页面 想要实现的效果 示例地址 实现过程 踩坑 示例是通过script引入的依赖&#xff0c;但本人需要在react项目中实现该效果。按照react-globe.gl官方方法引入总是报错 Cant import the named export AmbientLight from non EcmaS…

pb:导入EXCEL,提示“不能连接EXCEL”

pb:导入EXCEL,提示“不能连接EXCEL” ------------------------------------------------------------------------------------------------------------------------------- 1.pb连上EXCEL代码: //从EXCEL读取文件 STRING LS_PATH,LS_FILE,ls_file_tmp oleobject ole_1…

三国志14信息查询小程序(历史武将信息一览)制作更新过程02-基本架构

0&#xff0c;前期准备 &#xff08;1&#xff09;一台有公网IP的云服务器&#xff0c;服务器上安装MySQL数据库&#xff0c;启用IIS服务。出入端口号配置运行&#xff08;服务器和平台都要配置&#xff09;&#xff0c;IIS服务器上安装SSL证书 &#xff08;2&#xff09;域名…

Astah Professional 全功能专业UML建模工具软件

Astah Professional是Mac上一款全新的轻量级UML建模工具。软件集思维导图和UML建模于一体&#xff0c;采用100%纯JAVA构建&#xff0c; 兼容性强&#xff0c;不仅能够实现分布式建模、项目合并&#xff0c;还能够实现和其它建模工具的交互。 Astah Professional软件优点 1、易…

Maven修改仓库和镜像地址

目录 1、修改仓库地址2、修改镜像地址 1、修改仓库地址 使用IDEA时,如果不指定自己下载的Maven,idea会默认使用自带的Maven 3&#xff08;bundle)。maven 3默认的仓库路径一般是在c盘的用户文件夹中的.m2目录下&#xff1a; 当maven下的pom文件中的依赖逐渐增加时,maven仓库下…

leetcode:26. 删除有序数组中的重复项(python3解法)

难度&#xff1a;简单 给你一个 非严格递增排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。 考虑 nums 的唯一元素的数…

Android 13 GTS GtsPermissionControllerHostTestCases Test Failed

Android13 平板项目测试GtsPermissionControllerHostTestCases Failed&#xff0c;失败日志如下&#xff1a; java.lang.AssertionError: on-device tests failed: com.android.gts.permissioncontroller.PermissionControllerTest29#testGranted: java.lang.NullPointerExcep…

搭建专属品牌的独立题库小程序,自定义小程序名称和Logo|题库刷题小程序定制开发

土著刷题Plus专业版&#xff0c;以【录题-分组-刷题-考试】为中心打造一套完备的在线组卷刷题学习平台&#xff0c;自定义品牌名称和Logo&#xff0c;入驻后&#xff0c;您将拥有自己独立的企业级专业运营管理平台。 土著刷题Plus专业版v1.3.1版本&#xff0c;我们迭代了独立小…

uniapp踩坑之项目:uniapp数字键盘组件—APP端

//在components文件夹创建digitKeyboard文件夹&#xff0c;再创建digitKeyboard.vue <!-- 数字键盘 --> <template><view class"digit-keyboard"><view class"digit-keyboard_bg" tap"hide"></view><view clas…

【Spring Boot】发送邮件功能

发送邮件功能 一.pom.xml文件添加邮件依赖二.发送邮件信息&#xff08;1&#xff09;固定配置在application.yml&#xff08;2&#xff09;发送邮箱配成活&#xff08;3&#xff09;底层发送邮件方法&#xff08;4&#xff09;QQ邮箱开通smtp服务&#xff08;5&#xff09;网易…

基础课17——智能客服系统

客户服务是一种以客户为中心的服务模式&#xff0c;旨在提高客户满意度和忠诚度&#xff0c;促进企业业务增长和可持续发展。在客户服务中&#xff0c;企业需要了解客户需求&#xff0c;提供优质、高效、个性化的服务&#xff0c;解决客户问题&#xff0c;满足客户需求&#xf…

蓝图分离卷积BSConv 学习笔记 (附代码)

论文地址&#xff1a;https://arxiv.org/abs/2003.13549 代码地址&#xff1a;https://github.com/zeiss-microscopy/BSConv 1.是什么&#xff1f; BSConv是深度可分离卷积DSConv的升级版本&#xff0c;它更好地利用内核内部相关性来实现高效分离。具体而言&#xff0c;BSCo…