disruptor 高效队列
disruptor 是什么: disruptor 是一个 低延时的 无锁 环形 队列. 相较于 java的 队列 ,他有明显的优点 ,无界,无锁,低延时(解决了为内存共享问题 ) disruptor 就一个 高效的生产者消费者队列.
EventHandler ,WorkHandler 区别 , WorkHandler 适用于 多个消费者 中的一个消费这个 消息, EventHandler 适用于 每个消费者都要处理一下这个消息.
package com.cxygg.test; import java.util.concurrent.ThreadFactory; import com.lmax.disruptor.BlockingWaitStrategy;
import com.lmax.disruptor.EventFactory;
import com.lmax.disruptor.EventHandler;
import com.lmax.disruptor.EventTranslatorOneArg;
import com.lmax.disruptor.ExceptionHandler;
import com.lmax.disruptor.RingBuffer;
import com.lmax.disruptor.WorkHandler;
import com.lmax.disruptor.dsl.Disruptor;
import com.lmax.disruptor.dsl.ProducerType; public class DisruptorTest {
/**
* 消息事件类
*/
public static class MessageEvent{
/**
* 原始消息
*/
private String message; public String getMessage() {
return message;
} public void setMessage(String message) {
this.message = message;
}
} /**
* 消息事件工厂类
*/
public static class MessageEventFactory implements EventFactory<MessageEvent>{
@Override
public MessageEvent newInstance() {
return new MessageEvent();
}
} /**
* 消息转换类,负责将消息转换为事件
*/
public static class MessageEventTranslator implements EventTranslatorOneArg<MessageEvent,String> {
@Override
public void translateTo(MessageEvent messageEvent, long l, String s) {
messageEvent.setMessage(s);
}
} /**
* 消费者线程工厂类
*/
public static class MessageThreadFactory implements ThreadFactory{
@Override
public Thread newThread(Runnable r) {
return new Thread(r,"Simple Disruptor Test Thread");
}
} /**
* 消息事件处理类,这里只打印消息
*/
public static class MessageEventHandler1 implements WorkHandler<MessageEvent>{ @Override
public void onEvent(MessageEvent event) throws Exception {
System.out.println("消费1:" + event.getMessage());
} }
/**
* 消息事件处理类,这里只打印消息
*/
public static class MessageEventHandler2 implements WorkHandler<MessageEvent>{
@Override
public void onEvent(MessageEvent messageEvent) throws Exception {
System.out.println("消费2:" + messageEvent.getMessage());
}
}
/**
* 消息事件处理类,这里只打印消息
*/
public static class MessageEventHandler3 implements WorkHandler<MessageEvent>{
@Override
public void onEvent(MessageEvent messageEvent) throws Exception {
System.out.println("消费3:" + messageEvent.getMessage());
}
} /**
* 异常处理类
*/
public static class MessageExceptionHandler implements ExceptionHandler<MessageEvent>{
@Override
public void handleEventException(Throwable ex, long sequence, MessageEvent event) {
ex.printStackTrace();
} @Override
public void handleOnStartException(Throwable ex) {
ex.printStackTrace(); } @Override
public void handleOnShutdownException(Throwable ex) {
ex.printStackTrace(); }
} /**
* 消息生产者类
*/ public static class MessageEventProducer{
private RingBuffer<MessageEvent> ringBuffer; public MessageEventProducer(RingBuffer<MessageEvent> ringBuffer) {
this.ringBuffer = ringBuffer;
} /**
* 将接收到的消息输出到ringBuffer
* @param message
*/
public void onData(String message){
EventTranslatorOneArg<MessageEvent,String> translator = new MessageEventTranslator();
ringBuffer.publishEvent(translator,message);
}
} public static void main(String[] args) {
String message = "Hello Disruptor!";
int ringBufferSize = 2;//必须是2的N次方
Disruptor<MessageEvent> disruptor = new Disruptor<MessageEvent>(new MessageEventFactory(),ringBufferSize,new MessageThreadFactory(),ProducerType.SINGLE,new BlockingWaitStrategy()); disruptor.handleEventsWithWorkerPool(new MessageEventHandler1(),new MessageEventHandler2()).thenHandleEventsWithWorkerPool( new MessageEventHandler3() );
disruptor.handleEventsWithWorkerPool(new MessageEventHandler2(),new MessageEventHandler1()).thenHandleEventsWithWorkerPool( new MessageEventHandler3() );
disruptor.setDefaultExceptionHandler(new MessageExceptionHandler());
RingBuffer<MessageEvent> ringBuffer = disruptor.start(); MessageEventProducer producer = new MessageEventProducer(ringBuffer);
producer.onData( message +""); }
}
参考:https://blog.csdn.net/twypx/article/details/80398886
disruptor 高效队列的更多相关文章
- Nodejs事件引擎libuv源码剖析之:高效队列(queue)的实现
声明:本文为原创博文,转载请注明出处. 在libuv中,有一个只使用简单的宏封装成的高效队列(queue),现在我们就来看一下它是怎么实现的. 首先,看一下queue中最基本的几个宏: typede ...
- 从构建分布式秒杀系统聊聊Disruptor高性能队列
前言 秒杀架构持续优化中,基于自身认知不足之处在所难免,也请大家指正,共同进步.文章标题来自码友 简介 LMAX Disruptor是一个高性能的线程间消息库.它源于LMAX对并发性,性能和非阻塞算法 ...
- Disruptor极速队列
参考:http://www.cnblogs.com/haiq/p/4112689.html Disruptor 是线程内通信框架,用于线程里共享数据.LMAX 创建Disruptor作为可靠消息架构的 ...
- spring与disruptor集成的简单示例[z]
[z]https://www.jb51.net/article/135475.htm disruptor不过多介绍了,描述下当前的业务场景,两个应用A,B,应用 A 向应用 B 传递数据 . 数据传送 ...
- 10个Spring Boot快速开发的项目,接私活利器(快速、高效)
本文为大家精选了 码云 上优秀的 Spring Boot 语言开源项目,涵盖了企业级系统框架.文件文档系统.秒杀系统.微服务化系统.后台管理系统等,希望能够给大家带来一点帮助:) 1.项目名称:分布式 ...
- 想要快速上手 Spring Boot?看这些教程就足够了!
1.项目名称:分布式敏捷开发系统架构 项目简介:基于 Spring + SpringMVC + Mybatis 分布式敏捷开发系统架构,提供整套公共微服务服务模块:集中权限管理(单点登录).内容管理. ...
- 想要快速上手 Spring Boot?看这些教程就足够了!| 码云周刊第 81 期
原文:https://blog.gitee.com/2018/08/19/weekly-81/ 想要快速上手 Spring Boot?看这些教程就足够了!| 码云周刊第 81 期 码云周刊 | 201 ...
- 架构师养成记--15.Disruptor并发框架
一.概述 disruptor对于处理并发任务很擅长,曾有人测过,一个线程里1s内可以处理六百万个订单,性能相当感人. 这个框架的结构大概是:数据生产端 --> 缓存 --> 消费端 缓存中 ...
- 无锁并发框架Disruptor学习入门
刚刚听说disruptor,大概理一下,只为方便自己理解,文末是一些自己认为比较好的博文,如果有需要的同学可以参考. 本文目标:快速了解Disruptor是什么,主要概念,怎么用 1.Disrupto ...
随机推荐
- iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 5000 -j DNAT --to-destination
启动docker容器时报错: iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 5000 -j DNAT ...
- vue axios简单配置
参考:https://www.cnblogs.com/sophie_wang/p/7844119.html 1. 安装 npm install axios 2. main.js import axio ...
- centos7使用iptables作为防火墙方法
centos7使用iptables作为防火墙方法查看firewalld状态: systemctl status firewalld将centos7默认的firewalld停止,并将iptables作为 ...
- Shell 学习(三)
目录 Shell 学习(三) 流程控制 1 if判断 2 case 语句 3 for循环 4 while 循环 2 read 读取控制台输入 2.1 基本语法 2.2 应用实例 3 函数 3.1 系统 ...
- 2019-10-9-dotnet-不申请额外数组空间合并多个只读数组列表
title author date CreateTime categories dotnet 不申请额外数组空间合并多个只读数组列表 lindexi 2019-10-09 15:15:10 +0800 ...
- elast数据存放
这几天一直在索引数据,突然发现服务器状态变红色了,去官网看了下 集群状态如果是红色的话表示有数据已经丢失了!这下头大了才索引了7G数据,后面还有10多个G, 我在liunx下看了下磁盘空间 发现运行e ...
- 安装rancher以及使用rancher倒入kubernetes集群和添加及管理集群
1.docker安装rancher [root@rancher ~]# docker run -d --name rancher --restart=unless-stopped -p : -p : ...
- BZOJ 1040 (ZJOI 2008) 骑士
题目描述 Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬. 最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争.战火绵延五百里, ...
- java接口的意义,为什么接口可以多继承,而类不可以?
原文地址:http://www.cnblogs.com/yunxiblog/p/5240690.html java当中继承一个接口,要重写他的方法的话,那为什么还要多此一举的去实现一个接口呢? 直接把 ...
- 关于python3字符串中引号格式的看法,‘’,“”
关于字符串中引号格式的看法 在python3中,字符串统一使用: ' ' 或 " " 来表示,两者没有什么区别. 但是在使用的过程中,可以注意一下使用的方式,可以提高编程 ...