Disruptor中遇到的坑

并发框架Disruptor(核心概念 入门 高性能原理-伪共享 CAS 环形数据 生产和消费模式 高级使用 ) 并发框架Disruptor并发框架DisruptorDisruptor概述背景什么是Disruptor为什么使用DisruptorDisruptor 的核心概念Ring BufferSequenceSequencerSequence BarrierWait StrategyEventEventHandlerProducerDisruptor特性Disruptor入门性能对比测试Disruptor官方性能测试高性能原理伪共享概念什么是伪共享如何解伪共享填充字段@Contended注解Disruptor解决伪共 阅读详情

经朋友推荐,我在项目采用lmax的disruptor无锁队列框架来实现异步记录监控统计信息。disruptor体积很小,功能强大,一路配置下来,很容易上手,而且经过测试发现确实吞吐量比blockqueue性能提升了好几个数量级。可是直到有一天突然发现好久没收到监控的统计数据了,于是检查服务,发现服务状态是正常的,而且监控的定时任务也在后台定时收集,但数据库确实没更新;于是分几个方面来排查问题

1 检查db环境是否正常,其他服务也共用同一个db 但业务都正常运行,排除是db层的问题

2 通过jstack命令查看堆栈情况,一查看发现好多线程都在disruptor的produce进行nextsequence的时候在等待,问题基本定位了就是disruptor出现了死锁,网上也找到了几篇关于disruptor死锁的文章看了下 说是disruptor3.3.2的bug

Affects AAffects Version:3.3.2  Fix version:3.3.6
JDK 1.8
Cause: Nope this is not resolved by dropping the events. Ring Buffer Works on Producer and Consumer Thread Model.This issue actually happened due to signal missed by consumer. As per LMAX disruptor signal miss should not happen. 
这不是通过删除事件来解决。 环形缓冲区在生产者和消费者线程模型上工作。这个问题实际上是由于消费者错过信号而发生的。 根据LMAX中断器信号缺失不应该发生。 

If it detects that the ring buffer is full it will re-signal the wait strategy, this should unstick the consumer if it happened to miss a signal.
 如果它检测到环形缓冲区已满,它将重发信号的等待策略,如果它碰巧错过一个信号,这应该解锁消费者。
也可以改用Add LiteTimeoutBlockingWaitStrategy 

于是换成了disruptor3.3.6 并且也使用了LiteTimeoutBlockingWaitStrategy

可是过了2个月又出现了死锁的问题了,没办法 ,只能硬着头皮看disruptor源码,看看有没有什么新发现,

disruptor的事件发布是通过rightbuffer环形队列来生产和消费消息的, 为了避免未消费事件的写入覆盖,Sequencer需要监听所有消费者的消息处理进度,也就是gatingSequences。RingBuffer通过这种方式实现了事件缓存的无锁设计。 通过看源码发现是生产者速度大于消费者,导致生产一直在等待消费者消费完毕。

可是消费者执行不应该这么慢啊,怎么会消费很低呢,无意中看到了

com.lmax.disruptor.FatalExceptionHandler handleEventException
严重: Exception processing: 7490 com.tmri.cc.soa.disruptor.MonitiorEvent@75dc8e5b

于是有重点看下异常处理的源码

public void handleEventException(Throwable ex, long sequence, Object event) {
    this.logger.log(Level.SEVERE, "Exception processing: " + sequence + " " + event, ex);
    throw new RuntimeException(ex);
}

和BatchEventProcess的源码


catch (final Throwable ex) { exceptionHandler.handleEventException(ex, nextSequence, event); sequence.set(nextSequence); nextSequence++; }

原理是消费的过程中出现了异常,但没处理,被disruptor的workprocesser cath到了然后由默认FatalExceptionHandler处理,本意是FatalExceptionHandler 处理完之后 设置sequence,结果throw了异常 没处理导致。于是自定义了exceptionHandler 处理掉了异常,问题解决

架构师系列-并发框架Disruptor(一)- 入门 Disruptor是英国外汇交易公司LMAX开发的一个高性能内存队列,研发的初衷是解决内存队列的延迟问题(在性能测试中发现竟然与I/O操作处于同样的数量级),基于Disruptor开发的系统单线程能支撑每秒600万订单,2010年在QCon演讲后,获得了业界关注,2011年,企业应用软件专家Martin Fowler专门撰写长文介绍。同年它还获得了Oracle官方的Duke大奖。目前,包括Apache Storm、Camel、Log4j 2在内的很多知名项目都应用了Disruptor以获取高性能。 阅读详情

相关推荐

disruptor踩坑:当环空间全部用过后,有可能会出现脏数据

前情提要:disruptor是一个环状队列,并且环内的对象在启动的时候就已经进行了创建,这也是它快的原因之一 以下是短暂的代码时间: public class MyEvent { private Tag tag; private ClassA a; private ClassB b; } 下面的init写法就是问题所在了,我的环内...

u011006672的博客 2110

并发框架——Distruptor

目录 一、什么是Disruptor 二、Disruptor的设计方案 三、Disruptor实现特征 四、Disruptor实现生产者-消费者模式 4.1 依赖 4.2 声明Event 4.3 创建EventFactory 4.4 消费者 4.5 生产者 4.6 调用 五、Disryptor的核心概念 5.1 RingBuffer 5.1.1 什么是RingBuffer ...

lyj2018gyq的博客 8314

SpringBoot Disruptor框架遇到的问题

Disruptor的默认策略是BlockingWaitStrategy。在BlockingWaitStrategy内部是使用。

专注基础架构领域 1437

Disruptor详细介绍

Disruptor详细介绍

qq_44073614的博客 3562

【全开源】旅游系统源码(Uniapp+FastAdmin+ThinkPHP)

通过源码的灵活配置和定制开发,我们可以根据旅游企业的实际需求,快速构建出符合其业务特点的旅游系统。旅游系统源码,作为这一变革的基石,为旅游业的数字化转型提供了强有力的支撑。通过深入研究和应用旅游系统源码,我们能够构建出更加智能、便捷、个性化的旅游服务平台,满足游客日益增长的旅游需求。国际化发展:随着全球化的深入发展,旅游系统源码也将迎来国际化的发展机遇,为国内外游客提供更加便捷、高效的旅游服务。跨界融合:旅游系统源码将与更多领域进行跨界融合,如与交通、餐饮、购物等行业的结合,为游客提供更加丰富的旅游体验。

2401_84413757的博客 2153

深入浅出:拆解RK3588 DVP摄像头驱动框架,从DTS配置到V4L2子系统

本文深入解析RK3588 DVP摄像头驱动框架,从DTS配置到V4L2子系统的完整实现。详细介绍了瑞芯微RK3588的多媒体子系统架构、设备树配置逻辑、rkcif驱动与V4L2框架的交互机制,以及用户空间调试与性能优化技巧,帮助开发者解决DVP摄像头驱动中的常见问题。

weixin_42525632的博客 265

记一次Disruptor排坑

Abstract 我们在项目中使用了Disruptor作为事件总线,实现的业务是:用户消费完成成就,完成八个成就之后自动获得第九个成就——获得前面八个成就。 这个项目不是我参与的,当时我自己封装的高性能事件总线(Electrons)已经完全能胜任上述功能,但是由于小伙伴当时对我的这个组件没有特别研究,仍然感觉我的这个就是顺序执行前面几个监听器,就没有用。 这个项目在测试环境中一直没有问题,原因我分析一下有下: 并发量太小,RingBuffer的队列的size太小都完全足够。 测试环境中代码不稳定,

Java的专栏 4533

关于Vscode配置Unity环境时的一些报错问题(持续更新)

3.找到设置文件,添加如下代码,用于告诉VSCode)在处理 C# 项目时优先使用 C# 扩展来加载和管理项目,而不是使用 C# Dev Kit 或其他扩展。1.很可能是unity的插件版本问题,打开window > package manager将。2.很可能是项目文件的问题,建议unity打开edit > perfercenes。3.手动重装其他版本的.Net框架(去官网找,多下几个无所谓的)解决:(由于造成问题不一样,所以建议都尝试一次)下载net请求超时(一般都会超时很正常的)

bug制造机 1888

Disruptor RingBuffer预先创建对象的坑

Disruptor RingBuffer预先创建对象的坑

可馨的专栏 617

pgsql行列转换

‌是PostgreSQL中的一个函数,用于将一个字符串根据正则表达式进行分割,并将结果返回为一个表格,每个分割后的部分作为一行‌‌。string_agg() 函数是 PostgreSQL 中的一个聚合函数,用于将一个列中的值连接成一个字符串。

chimchim66的博客 3503

STM32声源定位:实现声源定位的嵌入式解决方案

通过以上代码,我们可以获取麦克风音频信号样本,并使用交叉相关法计算声源的位置。然而,我可以帮助您解答有关STM32声源定位的问题,提供相关的代码和指导。获取了麦克风音频信号后,我们可以使用信号处理算法来计算声源的位置。该算法通过计算不同麦克风之间的信号延迟来确定声源的方向。首先,我们需要获取每个麦克风的音频信号。声源定位是一项重要的技术,可以帮助我们确定声音的来源位置。在嵌入式系统中,使用STM32微控制器可以实现精确的声源定位。声源定位的基本原理是通过多个麦克风阵列接收到的声音信号来计算声源的位置。

UplKubernetes的博客 2581

从LMAX到你的项目:Disruptor环形缓冲区设计精髓与避坑指南

本文深入解析Disruptor环形缓冲区设计精髓,揭示其如何通过缓存行填充、无锁CAS等机制实现高性能内存队列。从LMAX交易所的实战经验出发,分享3.4.4版本中的调优技巧与避坑指南,帮助开发者在Java高并发场景中提升系统吞吐量。

h0i1j2k3l的博客 871

【网络安全】AntSword蚁剑新手快速入门(附实战案例)

蚁剑(AntSword)是一款开源的跨平台WebShell管理工具,它主要面向于合法授权的渗透测试安全人员以及进行常规操作的网站管理员。蚁剑的特点主要有如下几点:1.支持多平台。包括macOS、Linux 32位、Linux 64位、Linux armv7l、Linux arm64、Windows 32位、Windows 64位。2.完善的文档。中国蚁剑文档地址。3.多项功能。文件管理功能、虚拟终端功能、数据库管理功能。4.内置代理功能。

等风来 1万+

Maven项目配置Disruptor的正确姿势与常见坑点

关于Disruptor在Maven项目中的应用,许多开发者知道它是一个高性能队列,但在实际集成和使用中常遇到依赖配置、版本选择等具体问题。本文将从实际项目经验出发

2509_93883384的博客 357

SolidWorks软件二次开发:使用C#进行SolidWorks二次开发

SolidWorks 提供的 API(应用程序编程接口)允许开发者使用多种编程语言(如 C#、VB.NET 等)来控制和扩展 SolidWorks 的功能。API 架构基于 COM(组件对象模型),这意味着开发者可以通过引用 SolidWorks 的类型库来访问其对象模型。SolidWorks 的对象模型包括了从文档、零件、装配体到特征、草图等所有 SolidWorks 中可操作的对象。

kkchenjj的博客 3215

湿式双离合器自动变速器simulink建模与仿真

随着汽车工业的不断发展,自动变速器在提高汽车性能、驾驶舒适性和燃油经济性等方面发挥着越来越重要的作用。湿式双离合器自动变速器(Wet Dual-Clutch Transmission,简称 WDCT)作为一种先进的自动变速器技术,具有换挡速度快、动力传递平稳、燃油经济性好等优点,被广泛应用于各类汽车中。结构组成湿式双离合器自动变速器主要由双离合器、齿轮传动系统、液压控制系统和电子控制系统等部分组成。双离合器:由两个独立的离合器组成,分别控制奇数挡和偶数挡。通过切换两个离合器的工作状态,可以实现快速换挡。

平时工作较为繁忙,私信消息一般晚上回复,谢谢大家~~ 348

Disruptor避坑指南:从RingBuffer配置到WaitStrategy选择的7个实战经验

本文深入探讨Disruptor在高并发场景下的7个关键优化策略,包括RingBuffer容量设计、WaitStrategy选型、生产者模式选择等,结合JMH基准测试和真实案例,帮助开发者避开性能陷阱,提升Java线程安全队列的处理效率。

p5l2m9n4o6q的博客 207

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

artemis-disruptor-miaosha构建教程:4步打包秒杀系统war与jar包,零踩坑指南

artemis-disruptor-miaosha 是一套**不依赖 Redis** 的高并发秒杀解决方案,基于 ActiveMQ Artemis 消息队列 + LMAX Disruptor 实现,单机即可支撑每秒上万次下单请求。本文带你用 **4 步**完成整个项目的 Maven 构建打包,最终拿到部署用的 **war 包**(webapp 前端)和 **jar 包**(backend 后端),

gitblog_01013的博客 427

Statistics and Machine Learning Toolbox

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

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Disruptor如何实现百万级QPS电商秒杀系统

在高并发系统中,锁竞争和线程切换是影响性能的关键瓶颈。Disruptor作为一种高性能的环形队列框架,通过预分配内存、无锁CAS操作和序号栅栏等机制,有效解决了这些问题。其核心原理是利用空间换时间的策略,减少线程间的资源竞争,从而大幅提升吞吐量。在电商秒杀等高并发场景中,Disruptor能够显著降低延迟,提升系统稳定性。结合Redis集群和缓存预热等优化技巧,可以构建出百万级QPS的秒杀系统。本文通过实战案例,展示了如何利用Disruptor实现高性能的秒杀架构,并提供了性能优化和踩坑经验。

weixin_30667649的博客 478

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Disruptor

Disruptor Disruptor是什么? 高性能的异步处理框架,一个轻量级的JMS,和JDK中的BlockingQueue有相似处。 处理速度非常快,号称“一个线程一秒钟可以处理600W个订单”。 什么是JMS? Java Message Service(JMS):可以理解为一种消息通讯的规范和标准,即异步通讯的API,它为标准消息协议和消息服务提供了一组通用接口,包括创建、发送、读取消息等,用于支持JAVA应用程序开发。 JMS与RMI不同,发送消息的时候,接收者不需要在线。服务器发送了消息,

GZHarryAnonymous的博客 1210

首次使用disruptor框架遇到的问题

首次使用disruptor框架遇到的问题,就感觉有点麻瓜

搬运工007 1689

剖析Disruptor

剖析Disruptor:为什么会这么快?(一)锁的缺点 原文:http://ifeve.com/disruptor-locks-are-bad/ 作者:Trisha’s  译者:张文灼,潘曦  整理和校对:方腾飞,丁一 Martin Fowler写了一篇非常好的文章,里面不仅提到了Disruptor,而且还解释了Disruptor 如何应用在LMAX的架构里。里面有提及了

jianchow的博客 453

对Disruptor 并发架构的一些思考

对Disruptor 并发架构的一些思考 Disruptor的背景 Disruptor是一个高性能的异步处理框架,或者可以认为是最快的消息框架(轻量的JMS),也可以认为是一个观察者模式实现,或者事件-监听模式的实现,直接称disruptor模式。Disruptor最初由大神Martin Fowler 用作为LAMX系统的核心(一种新型的零售金融交易平台),其作为基于事件源驱动机制的业务逻...

一群专业码农的笔记本 1586

disruptor 资料整理

disruptor的优缺点:   没有竞争=没有锁=非常快。 所有访问者都记录自己的序号的实现方式,允许多个生产者与多个消费者共享相同的数据结构。 在每个对象中都能跟踪序列号(ring buffer,claim Strategy,生产者和消费者),加上神奇的cache line padding,就意味着没有为伪共享和非预期的竞争。   Disruptor 为什么快 1. 不使用锁。通过...

hnhygkx的博客 537

Disruptor挖坑MemoryAnalyzer来填

Disruptor误用循环创建对象导致内存占用高,程序一直保持启动未完成状态,MemoryAnalyzer分析内存文件获取问题代码段。

m0_48333563的博客 987
cloud_long
博客等级 码龄18年 11粉丝 1原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值