首页 > 其他分享 >Disruptor技术相关

Disruptor技术相关

时间:2023-10-02 18:44:06浏览次数:47  
标签:Disruptor name disruptor 技术 ringBuffer 相关 import public

简介

Disruptor是英国外汇交易公司LMAX开发的一个高性能队列,研发的初衷是解决内存队列的延迟问题(在性能测试中发现竟然与I/O操作处于同样的数量级)。基于Disruptor开发的系统单线程能支撑每秒600万订单,2010年在QCon演讲后,获得了业界关注。2011年,企业应用软件专家Martin Fowler专门撰写长文介绍。同年它还获得了Oracle官方的Duke大奖。

目前,包括Apache Storm、Camel、Log4j 2在内的很多知名项目都应用了Disruptor以获取高性能。

使用

<dependency>
    <groupId>com.lmax</groupId>
    <artifactId>disruptor</artifactId>
    <version>3.3.7</version>
</dependency>
import com.lmax.disruptor.EventHandler;
import com.lmax.disruptor.RingBuffer;
import com.lmax.disruptor.WorkHandler;
import com.lmax.disruptor.YieldingWaitStrategy;
import com.lmax.disruptor.dsl.Disruptor;
import com.lmax.disruptor.dsl.ProducerType;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;

import java.util.UUID;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * 多生产者多消费者的场景
 */
@Slf4j
public class TestDisruptorClient2 {
    public static void main(String[] args) throws InterruptedException {
        Disruptor<OrderEvent> disruptor = new Disruptor<>(
                OrderEvent::new,
                1024 * 1024,
                Executors.defaultThreadFactory(),
                // 这里的枚举修改为多生产者
                ProducerType.MULTI,
                new YieldingWaitStrategy()
        );
        //一个消息会被多个消费者消费
//        disruptor.handleEventsWith(new OrderEventHandler("李四"), new OrderEventHandler("张三"));
        //一个消费者仅会被一个消费者消费
        disruptor.handleEventsWithWorkerPool(new OrderEventHandler("李四"), new OrderEventHandler("张三"));
        disruptor.start();
        RingBuffer<OrderEvent> ringBuffer = disruptor.getRingBuffer();
        OrderEventProducer eventProducer = new OrderEventProducer(ringBuffer);
        // 创建一个线程池,模拟多个生产者
        ExecutorService fixedThreadPool = Executors.newFixedThreadPool(100);
        for (int i = 0; i < 100; i++) {
            fixedThreadPool.execute(() -> eventProducer.onData(UUID.randomUUID().toString()));
        }
    }

    /**
     * 消息内容
     */
    @Data
    public static class OrderEvent {
        private String id;
    }

    /**
     * 生产者
     */
    public static class OrderEventProducer {
        private final RingBuffer<OrderEvent> ringBuffer;

        public OrderEventProducer(RingBuffer<OrderEvent> ringBuffer) {
            this.ringBuffer = ringBuffer;
        }

        public void onData(String orderId) {
            long sequence = ringBuffer.next();
            try {
                OrderEvent orderEvent = ringBuffer.get(sequence);
                orderEvent.setId(orderId);
            } finally {
                ringBuffer.publish(sequence);
            }
        }
    }


    /**
     * 消费者
     */
    public static class OrderEventHandler implements EventHandler<OrderEvent>, WorkHandler<OrderEvent> {
        private String name;

        public OrderEventHandler(String name) {
            this.name = name;
        }

        @Override
        public void onEvent(OrderEvent event, long sequence, boolean endOfBatch) {
            log.info("name: {}, event: {}, sequence: {}, endOfBatch: {}", this.name, event, sequence, endOfBatch);
        }

        @Override
        public void onEvent(OrderEvent event) {
            log.info("name: {}, event: {}", this.name, event);
        }
    }
}

这个库在soft-jraft(一个开源的raft协议实现)中有被使用到。

参考

高性能队列——Disruptor
高性能队列 Disruptor 使用教程

标签:Disruptor,name,disruptor,技术,ringBuffer,相关,import,public
From: https://www.cnblogs.com/strongmore/p/17315928.html

相关文章

  • Windows系统相关无响应(记录)
    开机很慢,按任何win快捷键都呼不出窗口,包括win+r、win+x、win(重启也没用);但桌面应用能正常开,.bat也可以照常执行,右键壁纸也可以出现界面(但点控制面板有关直接报错)这直接给我人淦懵了(我大部分软件都是靠按win搜索开的,所以cmd也开不开)但在我用edge找资料的时候就莫名其妙的好......
  • 内网穿透:实现远程访问和测试内部网络的关键技术
    ......
  • 互联网医院App开发:构建医疗服务的技术指南
    互联网医院App的开发是一个复杂而具有挑战性的任务,但它也是一个充满潜力的领域,可以为患者和医疗专业人员提供更便捷的医疗服务。本文将引导您通过一些常见的技术步骤来构建一个简单的互联网医院App原型,以了解该过程的基本概念。技术栈选择在开始之前,您需要选择适合互联网医院App开......
  • JSP技术
    JSP技术基础第1关:JSP脚本元素1-5DABBB6-8BCB第2关:JSP指令1-5AABBB第3关:JSP隐式对象1-2BD第4关:EL表达式和JSTL标签库1-5ADCCD6-8DAD基于JSP的网上商店packagecom.educoder.service.impl;importjava.util.List;importcom.educoder.entity.Goods;i......
  • 计算机音视频技术的发展与应用
    随着科技的不断进步,计算机音视频技术在各个领域得到了广泛的应用,从个人娱乐到商业活动再到教育培训,都离不开音视频技术的支持。本文将介绍计算机音视频技术的发展历程以及其在各个领域中的重要作用。1.发展历程计算机音视频技术的发展始于上世纪70年代。最早的音频技术是基于模拟......
  • 解密网络通信的关键技术(下):DNS、ARP、DHCP和NAT,你了解多少?
    引言在上一章中,我们详细介绍了域名系统(DNS)和地址解析协议(ARP)的工作原理,从而对域名解析和介质访问控制(MAC)地址寻址有了更深入的了解。在今天的章节中,我们将继续探讨动态主机配置协议(DHCP)和网络地址转换(NAT)技术,以便更好地理解IP地址的动态分配和解决IPv4地址枯竭问题的NAT技术的引......
  • 国标GB28181视频平台EasyCVR利用视频汇聚技术助力发觉人员区域入侵
    TSINGSEE青犀视频人员/区域入侵功能能够对关键区域进行实时监测,实现全天候的监控和管控。当系统监测到有人员接近或闯入监控区域时,AI算法会立即发出告警并通知管理人员,以从被动的"监督"变为主动的"监控",实现事前预警、事中检测和事后规范处理,大大提高了监控区域的管控效率。  ......
  • Linux第五周技术博客
    这周我们学习Linux用户的管理我们需要了解普通用户和超级管理员的区别,用户命令的增删改查,普通用户于超级管理员之间的切换,普通用户之间的切换,普通用户的配置文件操作Linux系统是一个多用户多任务的分时操作系统,每个进程都有一个特定的文件,文件为一个特定的用户拥有。每一个用户......
  • Linux第三周技术博客
    这周我们开始学习Linux文件管理首先我们来学习Linux文件目录与路径,Windows系统以多根的方式组织文件,它可以有多个根目录。而Linux系统所有的文件都在根目录/下,其中箭头指向真实存在的文件。如果用户想要查看根目录下的文件用ls命令,输出结果中不同颜色代表不同的文件类型,蓝色代......
  • Go每日一库之149:PDF处理相关库
    PDF处理场景:pdf渲染pdf校验pdf加水印pdf获取页数pdf合并pdf拆分修复受损pdfpdf转png识别pdf中的字体pdf解密...一、HTML页面渲染PDF根据html页面渲染pdf,我使用过以下两种方案:wkhtmltopdfchromedp1.使用wkhtmltopdf渲染pdfwkhtmltopdf是一个命令行工具,用......