【并发编程】无锁环形队列Disruptor并发框架使用

Disruptor 是苹国外厂本易公司LMAX开发的一个高件能列,研发的初夷是解决内存队列的延识问顾在性能测试中发现竟然与10操作处于同样的数量级),基于Disruptor开发的系统单线程能支撑每秒600万订单,2010年在QCn演讲后,获得了业界关注,201年,企业应用软件专家Martin Fower专门撰写长文介绍。同年它还获得了Oradle官方的Duke大奖。目前,包括Apache StomCame、 L0g4 2在内的很多知名项目都应用了Disrupior以获取高性能。注意,这里所说的队列是系统内部的内存队列,而不是Kaka这样的分布式队列。

前两篇介绍了Disruptor,【数据结构】Disruptor环形数组无锁并发框架阅读_wenchun001的博客-CSDN博客

【并发编程】ShenyuAdmin里面数据同步用到的无锁环形队列LMAX Disruptor并发框架_wenchun001的博客-CSDN博客

今天开始依次从引用包到编码步骤说明如下

引用依赖

复制代码
    <dependencies>
        <dependency>
            <groupId>com.lmax</groupId>
            <artifactId>disruptor</artifactId>
            <version>3.3.4</version>
        </dependency>
    </dependencies>

1.构建消息载体(事件)

复制代码
单生产者单消费者模式
1,创建Event(消息载体/事件)和EventFactory (事件工厂)
2,创建 OrderEvent类,这个类将会被放入环形队列中作为消息内容。创建OrderEventFactory类,用于创建OrderEvent   事件
复制代码
@Data
public class OrderEvent2 {
    private long value;
    private String name:
}

public class OrderEventFactory implements EventFactory<orderEvent> {
    @Override
    public OrderEvent newInstance()
    {
        return new OrderEvent();
    }
}

2.构建生产者

创建 OrderEventProducer 类,它将作为生产者使 用

复制代码
public class OrderEventProducer {
        //事件队列
        private RingBuffer<OrderEvent> ringBuffer;
        public OrderEventProducer(RingBuffer<OrderEvent> ringBuffer)( this,ringBuffer =ringBuffer;}
        public void onData(long value,String name) {
            // 获取事件队列 的下一个槽
            long sequence = ringBuffer.next();
            try {
                //获取消息 (事件)
                OrderEvent orderEvent = ringBuffer.get(sequence);
                // 写入消息数据
                orderEvent.setValue(value):
                orderEvent.setName(name);
            }catch (Exception e){
                //异常
            }finally {
                //发布事件
                rringBuffer.publish(sequence);
            }
        }
}

3.构建消费者

4.生产消息,消费消息的测试

复制代码
    public static void main(String[] args) throws Exception {
        //创建disruptor
        Disruptor<OrderEvent> disruptor = new Disruptor<>(new OrderEventFactory()ringBufferSize:124 * 124
        Executors.defaultThreadFactory(), ProducerType.SINGLE,//单生产者
                new YieldingwaitStrategy() //等待策略
        );

        //设置消费者用于处理RingBuffer的事件  
        disruptor.handleEventswith(new OrderEventHandler());
        //设置多消费者,消息会被重复消费
        //disruptor.handleEventswith(new OrderEventHandler(),new OrderEventHandler());
        //设置多消费者 消费者要实现workHandLer接口,一条消息只会被一个消费者消费
        //disruptor.handleEventsWithworkerPool(new OrderEventHandler(), new OrderEventHandler());

        //启动disruptor
        disruptor.start();
        //创建ringbuffer容器
        RingBuffer<OrderEvent> ringBuffer = disruptor.getRingBuffer();
        //创建生产者
        OrderEventProducer eventProducer = new OrderEventProducer(ringBuffer);// 发送消息
        for(int i=0;i<10;i++){
            eventProduceronData(i, "消息"+1);
        }
        disruptor.shutdown();
    }

多生产者的案例

复制代码
//创建disruptor
        Disruptor<OrderEvent> disruptor = new Disruptor<>(new OrderEventFactory()ringBufferSize:124 * 124
        Executors.defaultThreadFactory(), ProducerType.MULIT,//多生产者
                new YieldingwaitStrategy() //等待策略
        );

消费者优先级模式

在实际场景中,我们通常会因为业务逻而形成一条消费链,比如一个消息必须由 消费者A->消费者B->消费者C 的顺序依次进行消费。在配置消费者时,可以通过.then 方法去实现顺序消费。

I disruptor.handleEventswith(new OrderEventHandler())

then(new OrderEventHandler())

then(new OrderEventHandler());

handleEventsWith 与 handleEventsWithworkerPool 都是支持hen 的,它们可以结合使用。比可以按照消费者A 消费者B 消费者C)->消费者D 的消费项序

1 disruptor.handleEventswith(new OrderEventHandler())

thenHandleEventsWithworkerPool(new OrderEventHandler(), new OrderEventHandler())

then(new OrderEventHandler());

相关推荐
huainingning5 分钟前
华三华为锐捷迈普中兴交换机二三层接口切换命令
服务器·网络·华为
萧行之6 分钟前
Observalble Plot和图形语法理论
前端·数据可视化
开开心心就好8 分钟前
手机悬屏翻译工具外语游戏漫画APP全覆盖
android·前端·javascript·python·游戏·pdf·html
吴声子夜歌14 分钟前
Guava——集合(二)
java·guava
xiaoqiMikko14 分钟前
一句“为了保持同步”的注释,正好打破了同步 —— Netty 响应错配漏洞实测
java
奇树谦14 分钟前
Seaweed中filer.sync原理
linux·服务器·网络
支支დ14 分钟前
Phind 前端特定优势:AI 编程助手的体验革新
前端
Huangjin007_16 分钟前
【Linux 系统篇(十六)】进程(四) : 僵尸进程、孤儿进程、进程优先级
linux·运维·服务器
疯狂打码的少年18 分钟前
【数据库技术】SQL高级查询(分组/排序/聚合函数)
java·数据库·笔记·sql
DDXYcoder20 分钟前
万字解析动态内存从编译到运行
java·前端·算法