Disruptor多个消费者不重复处理生产者发送的消息的demo

日志异步落库:可靠性、吞吐与解耦的工程平衡术 日志异步落库是现代高并发系统可观测性基建的核心环节,其本质是在数据可靠性、系统吞吐和业务解耦之间构建稳健平衡。它源于对同步写库‘阻塞争抢’‘故障传播’‘语义污染’三重风险的系统性规避,技术原理涵盖无锁队列(如Disruptor)、本地磁盘缓冲(mmap)、序列化优化(Protobuf)及降级容错机制。该方案显著提升Java后端在金融、IoT、SaaS等场景下的日志处理能力,支撑百万级QPS稳定写入,同时保障核心交易链路零干扰。本文聚焦生产级落地细节,覆盖RingBuffer容量设计、fsync策略调优、日志 阅读详情

上一篇介绍的一个生产者向ringbuffer发送了10条消息,每个消费者都会把这个10个消息消费一遍,但是我们还有一种需求就是要让多个消费者不重复消费消息,下面这个简单demo实现了此功能:

创建一个消息的生产者类:

package Disruptor2;

import com.lmax.disruptor.RingBuffer;

import Disruptor.TradeTransaction;

public class Producer {
	private RingBuffer<TradeTransaction> ringBuffer;

	public Producer(RingBuffer<TradeTransaction> ringBuffer) {
		this.ringBuffer = ringBuffer;
	}

	public void onData() {
		// 可以把ringBuffer看做一个事件队列,那么next就是得到下面一个事件槽
		long sequence = ringBuffer.next();
		try {
			
		} finally {
			System.out.println("生产者发送了一条消息");
			ringBuffer.publish(sequence);
		}
	}
}


创建一个消息的消费者类:

package Disruptor2;

import com.lmax.disruptor.WorkHandler;

import Disruptor.TradeTransaction;

public class Consumer implements WorkHandler<TradeTransaction>{

	@Override
	public void onEvent(TradeTransaction event) throws Exception {
		// TODO Auto-generated method stub
		System.out.println("消费者C1消费了一条消息");
	}

}

创建一个IntEventExceptionHandler类:

package Disruptor2;
import org.apache.log4j.Logger;

import com.lmax.disruptor.ExceptionHandler;

public class IntEventExceptionHandler implements ExceptionHandler {
	private static final Logger logger = Logger.getLogger(IntEventExceptionHandler.class);

	public void handleEventException(Throwable ex, long sequence, Object event) {
		logger.error("handleEventException", ex);
	}

	public void handleOnStartException(Throwable ex) {
		logger.error("handleOnStartException", ex);
	}

	public void handleOnShutdownException(Throwable ex) {
		logger.error("handleOnShutdownException", ex);
	}
}

编写一个测试类:

package Disruptor2;

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

import com.lmax.disruptor.EventFactory;
import com.lmax.disruptor.RingBuffer;
import com.lmax.disruptor.SequenceBarrier;
import com.lmax.disruptor.WaitStrategy;
import com.lmax.disruptor.WorkerPool;
import com.lmax.disruptor.YieldingWaitStrategy;
import com.lmax.disruptor.dsl.ProducerType;

import Disruptor.TradeTransaction;

public class Disruptor2 {
	
	public static void main(String[] args) {
		Long time = System.currentTimeMillis();
		RingBuffer<TradeTransaction> ringBuffer;
		Producer producer = null;
		// 创建缓冲池
		ExecutorService executor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
		// 创建工厂
		EventFactory<TradeTransaction> factory = new EventFactory<TradeTransaction>() {
			@Override
			public TradeTransaction newInstance() {
				return new TradeTransaction();
			}
		};
		// 创建bufferSize ,也就是RingBuffer大小,必须是2的N次方
		int ringBufferSize = 1024 * 1024; //
		WaitStrategy YIELDING_WAIT = new YieldingWaitStrategy();
		// 创建ringBuffer
		ringBuffer = RingBuffer.create(ProducerType.MULTI, factory, ringBufferSize, YIELDING_WAIT);
		SequenceBarrier barriers = ringBuffer.newBarrier();
		// 创建10个消费者来处理同一个生产者发的消息(这10个消费者不重复消费消息)
		Consumer[] consumers = new Consumer[10];
		for (int i = 0; i < consumers.length; i++) {
			consumers[i] = new Consumer();
		}
		WorkerPool<TradeTransaction> workerPool = new WorkerPool<TradeTransaction>(ringBuffer, barriers,
				new IntEventExceptionHandler(), consumers);

		ringBuffer.addGatingSequences(workerPool.getWorkerSequences());
		workerPool.start(executor);

		producer = new Producer(ringBuffer);

		for (int i = 0; i < 10; i++) {
			producer.onData();
		}
		//executor.shutdown();
		System.out.println("花费时间 :" + (System.currentTimeMillis() - time));
	}
}

测试结果如下:

生产者发送了一条消息
生产者发送了一条消息
生产者发送了一条消息
生产者发送了一条消息
生产者发送了一条消息
生产者发送了一条消息
生产者发送了一条消息
生产者发送了一条消息
生产者发送了一条消息
生产者发送了一条消息
消费者C1消费了一条消息
消费者C1消费了一条消息
消费者C1消费了一条消息
消费者C1消费了一条消息
消费者C1消费了一条消息
消费者C1消费了一条消息
消费者C1消费了一条消息
消费者C1消费了一条消息
消费者C1消费了一条消息
花费时间 :146
消费者C1消费了一条消息

由结果可以看出来,一共生成了10个消费者用于消费生产者产生的消息,每一条消息只消费了一次




disruptor-demo:希望想使用disruptor的同学可以尽快上手 disruptor-demo 希望想使用disruptor的同学可以通过这些demo尽快上手 立即下载

相关推荐

VSCode多文件C语言项目编译实战:从配置到运行

本文详细讲解了如何在VSCode中配置多文件C语言项目的编译环境。通过手把手教学,指导读者创建项目结构、编写代码,并重点深度配置task.json与launch.json文件,实现一键编译和调试所有C文件,解决常见的“undefined reference”等链接错误,提升开发效率。

g8f9d0s1a2的博客 1098

disruptor 多个消费者 但是只消费一次 有时候会有这样的需求

disruptor 多个消费者 但是只消费一次 网上很少有这方面的资料 public final class MyHandler implements EventHandler { private final long ordinal; private final long numberOfConsumers; public MyHandler(final long

tsshouhu的专栏 1780

PuTTY使用方法

PuTTY是一款开源SSH/Telnet客户端,主要用于Windows系统连接Linux服务器。使用步骤包括:下载安装PuTTY,输入服务器IP和端口(默认22),可选择保存会话配置。支持密码和SSH密钥认证(需转换.pem为.ppk格式)。首次连接需确认主机密钥,成功登录后可执行Linux命令。其他功能包括会话日志记录、X11转发和端口隧道配置。操作完成后输入exit断开连接。

特网云计算 3152

disruptor开启单消费者多线程消费

Disruptor 是一个高性能的内存队列,它支持单消费者多线程消费。要启用这种模式,你需要在创建 Disruptor 实例时,将 WorkProcessor.class 作为事件处理器的类型参数传递给 Disruptor 构造函数。然后,你可以通过调用 WorkProcessor 实例的 start() 方法来启动它。这样,Disruptor 就会创建多个线程,并使用这些线程来并行地消费事件。 ...

weixin_35752645的博客 901

LVGL(lv_table)

LVGL中的lv_table是一个轻量级表格控件,用于显示行列式文本数据。它支持设置单元格内容/样式、行列调整、事件响应等基础功能,适用于参数配置、数据展示等场景。通过API可快速创建表格,设置行列数、填充数据,并自定义对齐方式与样式。但需注意默认无滚动条、行数限制等问题。该控件适合简单表格需求,复杂交互需结合自定义事件处理。

m0_49476241的博客 1262

使用 Python 调用 GitHub REST API 爬取 GitHub 仓库信息(完整指南)

GitHub 提供了功能强大的 REST API,允许开发者通过编程方式访问 GitHub 上的仓库、用户、提交记录、PR(Pull Request)等信息。GitHub REST API 是 GitHub 官方提供的 API 接口,支持通过 HTTP 请求来操作 GitHub 上的资源。在本文中,我们将使用 Python 编写一个完整的爬虫程序,调用 GitHub 的 REST API 来爬取 GitHub 仓库的信息。目前 GitHub 使用的主要是 v3 版本的 REST API。

2201_76125261的博客 1110

使用Disruptor完成多个消费者不重复消费消息

上一篇https://blog.youkuaiyun.com/tianyaleixiaowu/article/details/79787377里讲了Disruptor完成多个消费者并行、顺序重复消费Event。重复消费类似于kafka中,同一个topic被不同的group的消费者消费。这样的场景比较常见。当然更常见的场景是不重复消费,也就是一个消息只能被消费一次。Disruptor同样可以完成不重复消费的功能...

tianyaleixiaowu的专栏 9212

TextView部分文字可以被点击的效果。TextView拼接图片,图片可以被点击

今有一需求,就是列表标题后拼接图标,点击图标跳转一个web页; 这里简单做下笔记,以供需要的人参考: //设置部分文字点击事件 ClickableSpan clickableSpan = new ClickableSpan() { @Override public void onClick(View widget) { Toast.makeText(conte...

LXFX1108的专栏 692

springboot整合disruptor(多种消费者执行模式)

/定义用于事件处理的线程池, Disruptor通过java.util.concurrent.ExecutorSerivce提供的线程池来触发consumer的事件处理。//这么写就认定只有3个消费者 ThreadFactory executor = Executors . defaultThreadFactory();//指定事件工厂 MessageEventFactory factory = new MessageEventFactory();

qq_38639813的博客 5690

【AUTOSAR SystemServices】深入解析StbM模块:功能定义、工作原理与代码实现

STBM模块:AUTOSAR同步时基管理核心解析 STBM(同步时基管理器)是AUTOSAR标准中实现车载系统时间同步的关键模块,主要功能包括: 时间基准管理:支持全局时基、偏移时基和纯本地时基三种类型,通过StbM_SetGlobalTime和StbM_SetOffset实现主从节点同步。 校正机制:采用偏移校正和速率校正算法(PPM级精度)补偿时钟偏差,确保多ECU时间一致性。 事件处理:监控时间跳变和超时事件,通过回调机制通知上层应用。 典型应用:用于CAN/Ethernet总线同步、时间触发调度及诊

1458

灰度图像采集显示

灰度图像采集显示 在FPGA内部,采集到的视频数据线通过一个FIFO,将原本与25MHZ时钟同步的数据流转换到FPGA内部50MHZ的时钟。接着将这个数据再送入写DDR3缓存的异步FIFO中,这个FIFO中的数据一旦达到一定数量,就会被写入DDR3中。于此同时,使用另一异步FIFO缓存从DDR3读出的图像数据;LCD驱动模块不断地发出读图像数据请求给到这个FIFO,从中读取图像数据并送给VGA显示器进行实时图像的显示。 ...

小柚子的博客 484

Disruptor框架简述以及重复消费问题处理

1.什么是Disruptor Martin Fowler在自己网站上写了一篇LMAX架构的文章,在文章中他介绍了LMAX是一种新型零售金融交易平台,它能够以很低的延迟产生大量交易。这个系统是建立在JVM平台上,其核心是一个业务逻辑处理器,它能够在一个线程里每秒处理6百万订单。业务逻辑处理器完全是运行在内存中,使`用事件源驱动方式。业务逻辑处理器的核心是Disruptor。 Disruptor它...

yjt520557的博客 2530

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Disruptor 详解 一

这篇博客将主要通过几个示例,简单讲述 Disruptor 的使用方法; 一、disruptor 简介 Disruptor 是英国外汇交易公司 LMAX 开发的一个无锁高性能的线程间消息传递的框架。目前包括 Apache Storm、Camel、Log4j2 等知名项目都是用了 Disruptor; 因为 Disruptor 中的一个很重要的结构 RingBuffer 和 JDK 中的 ArrayB...

weixin_30340353的博客 217

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Disruptor-简单使用

本文介绍了 Disruptor 的简单使用,以及复杂场景下消费者的配置。

王谷雨的博客 695

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Disruptor + 责任链:构建高性能事件处理系统的单机最佳实践

在现代应用开发中,高效处理异步事件是提升系统吞吐量和用户体验的关键。本文将深入探讨如何结合LMAX Disruptor这一顶级并发框架与经典的责任链设计模式,打造一套高性能、高灵活性、易扩展的单机事件处理系统。我们将通过一个具体的Demo项目,展示其核心设计思路与最佳实践代码

2302_79422829的博客 862

Java并发编程实战:生产者-消费者模型与BlockingQueue应用详解

在并发编程中,线程安全与资源共享是核心挑战。生产者-消费者模型通过解耦数据生成与处理过程,利用阻塞队列实现线程间高效协作。其技术价值在于平衡系统负载、提升吞吐量,并避免资源竞争导致的数据不一致问题。该模型广泛应用于任务调度、消息处理、数据缓冲等场景,是构建高并发系统的基石。本文以Java的BlockingQueue为例,结合分布式任务调度中的角色动态转换问题,深入解析如何通过线程安全队列实现优雅的并发控制。文章涵盖线程安全、阻塞操作、优雅关闭等关键机制,并提供完整代码示例与工程实践建议,帮助开发者掌握并发编

weixin_33861800的博客 509

生产者消费者问题:高并发系统稳定性核心原理与实战

生产者消费者问题本质是多线程/多进程协作中数据流节奏失衡引发的系统性风险,其底层原理在于缓冲区容量、处理速率差与背压机制三者的动态博弈。该模型直接决定消息队列吞吐、线程池稳定性、实时服务延迟等关键技术指标,广泛应用于订单系统、IoT数据采集、风控引擎等高并发场景。理解其在Java阻塞队列、Kafka offset管理、Disruptor环形缓冲区中的差异化实现,是构建可监控、可降级、可伸缩分布式系统的前提。本文聚焦真实线上问题——如无界队列导致OOM、notifyAll引发唤醒风暴、消费者CPU 100%实

weixin_34067102的博客 664

SpringBoot监听Redis键事件:从Pub/Sub原理到生产环境实战

在分布式系统中,缓存是提升应用性能的核心组件,而Redis作为高性能的内存数据库,其数据状态变更的实时感知能力对系统一致性至关重要。这背后依赖的是Redis的发布订阅(Pub/Sub)机制,它允许客户端订阅特定频道以接收事件通知。基于此机制,Redis提供了键空间通知功能,能够将键的新增、修改、删除及过期等事件主动推送给订阅者,实现了数据变更的实时响应。这一技术为缓存同步、数据库双写、审计日志和业务流程触发等场景提供了高效解决方案。本文聚焦于如何在SpringBoot框架中,通过配置`notify-keys

weixin_30521161的博客 284

Java后端面试7天冲刺:从HashMap到系统设计,构建实战知识体系

在Java后端开发领域,掌握核心数据结构与算法是构建高性能应用的基础。以HashMap为例,其底层通过数组、链表与红黑树的组合实现高效的键值存储,其扩容机制、哈希冲突解决策略及线程安全考量,直接关系到应用在高并发场景下的性能与稳定性。理解这些原理,有助于开发者根据业务场景选择合适的集合实现,例如在缓存、分布式锁等实际应用中做出最优技术选型。本文聚焦HashMap、JVM、高并发等核心模块,通过原理剖析与场景设计,帮助读者构建从底层到实战的完整知识体系,应对深度技术面试。

weixin_34238633的博客 340

操作日志系统设计:基于Spring Boot实现灵活时间范围查询与性能优化

操作日志是保障系统可追溯性、支持审计与问题排查的核心组件,其设计原理涉及数据模型、存储策略与查询优化等多个层面。通过合理设计日志表结构,特别是为操作时间字段建立索引,可以显著提升查询效率。在技术价值上,一个健壮的日志系统不仅能满足合规性要求,还能为行为分析、异常检测提供数据支撑。在应用场景中,财会职业能力养成平台常需查询如“1月前4天”这类灵活时间段的用户操作记录,这要求后端能准确计算时间范围并高效执行查询。本文以Spring Boot和MyBatis-Plus为例,详细阐述了如何通过AOP切面实现日志的自

weixin_33754065的博客 362

使用Disurptor一个生产者多个消费者不重复消费数据与BlockingQueue性能对比

        作为比较接近正式使用的方式,我用一个生产者多个消费者来进行了Disurptor的不重复消费的性能测试,在这里我主要是介绍下我在测试过程中使用的代码以及出现的情况做下说明,这些情况有可能是我自己的代码原因引起的,在此也给自己留一个记录,如果看到的同学提出异议的麻烦给我说一下,关于Disruptor的其他介绍可以参考http://357029540.iteye.com/blog/2...

XinhuaShuDiao的博客 660

Disruptor的事件处理机制

单生产者,多消费者模式。消费者1、2不重复消费消息,消费者3、4消费消费者1或2消费过的消息,且独立重复消费。消费者5消费消费者3、4均消费过的消息。单生产者,多消费者模式。消费者1、2独立消费每一条消息,消费者3、4不重复消费消费者1、2均处理过的消息,消费者5消费消费者3或4消费过的消息。消费者之间存在消费顺序,相当于在各个EventHandlerGroup之间进行级联,形成依赖关系。多消费者之间不重复消费,且不同的消费者WorkPool之间存在依赖关系。多生产者,单消费者版本。...

不甘平庸的人 1420

使用disruptor队列实现本地异步消费

disruptor高性能队列使用,本地异步传输处理mysql数据到elastic search

小蜜蜂1010的博客 2106

disruptor简单入门demo

首先写event 然后写eventFactory 然后写消费者eventHandler 和生产者eventProducer 最后写main 例子:生产者每秒写入一个Long数字,消费者负责打印出来 //event package demo_1.event; public class LongEvent { private long value; p...

hello world 2081

Disruptor入门

一、什么是 Disruptor Disruptor是一个高性能的异步处理框架,或者可以认为是最快的消息框架(轻量的JMS),也可以认为是一个观察者模式实现,或者事件-监听模式的实现,直接称disruptor模式。disruptor最大特点是高性能,其LMAX架构可以获得每秒6百万订单,用1微秒的延迟获得吞吐量为100K+。 可以理解为消费者-生产者的消息发布订阅模式。 二、Disruptor ...

weixin_34205076的博客 215
上一篇: Disruptor多个消费者独立处理生产者消息的简单demo
下一篇: 聚集索引和非聚集索引(整理)
java1993666
博客等级 码龄11年 22粉丝 29原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值