Disruptor

高性能队列——Disruptor Disruptor通过精巧的无锁设计实现了在高并发情形下的高性能。在美团内部,很多高并发场景借鉴了Disruptor的设计,减少竞争的强度。其设计思想可以扩展到分布式场景,通过无锁设计,来提升服务性能。使用Disruptor比使用ArrayBlockingQueue略微复杂,为方便读者上手,增加代码样例。代码实现的功能:每10ms向disruptor中插入一个元素,消费者读取数据,并打印到终端。详细逻辑请细读代码。以下代码基于3.3.4版本的Disruptor包。/** 阅读详情

Disruptor

 

1. 背景

在给Lancer用户开发第三方SDK时,发现当用户使用SDK在一段很短的时间内发送大量数据到Lancer的接收端时,如果使用Logback的AsyncAppender会存在数据丢失的情况,当切换到LogIeventDisruptor则不会出现这种情况,数据交互非常顺利。其中AsyncAppender底层使用的是ArrayBlockingQueue,Disruptor使用的是RingBuffer。

 

2. 找问题

我们知道当发送端要在一段很短的时间内发送出大量的数据,如果直接用线程给远端发送数据,则必然会导致阻塞的发生;这个时候我们的正常反应就是建一个队列,将要发给远端的数据缓冲起来,让线程去消费这个队列把数据发送到远端;那么问题来了,队列得使用也分场景的。

 

3. 队列

队列名称

是否阻塞

锁的类型

竞争位置

数据结构

LinkedBlockingQueue

是

ReentrantLock

head / last

链表

ArraryBlockingQueue

是

ReentrantLock

takeIndex / putIndex

数组

ConcurrentLinkedQueue

否

CAS

head / tail

链表

RingBuffer

否

CAS

sequence

数组

 

4. Disruptor

4.1 数组预分配,避免GC带来的运行开销

链表队列在出队的时候需要把自己第一个Node的Next指向自己,来让JVM快速的知道这个Node已经可以被删除了,然后按照某种策略进行GC操作,这必然会带来一部分开销。

数组虽然可以避免节点被删除后的GC操作,但是会存在两个问题,一个是长度的固定需要预先判断,不然就容易导致队列满了,数据就会丢失;另一个就是要知道当前的位置就必须进行一次Mod计算,在Disruptor里面用了一个技巧,当数组长度为2的N次方时可以使用位操作来获取当前位置(location & (2的N次方 - 1))

 

4.2 不用阻塞锁

并发时存在共享变量时,基本上伴随着就是多个线程对这个变量的竞争,一般的做法是用阻塞锁来让线程在处理这个变量时变得有序,得到一个我们想要的结果,但是速度慢已经是公认的;另一种做法就是用系统底层提供的CAS(Compare and Swap)来处理共享变量的竞争,保证每次只有一个线程可以修改共享变量的值。

 

4.3 避免伪共享

在一个实现队列的类里面会有多个变量是用来操作或者描述这个队列的一种属性,当多个线程并发时这些变量会被缓存到CPU的Cache中,当存在某两个变量在内存中的地址相邻,可能会存在一个CPU的核心把两个变量都读到缓存中,另一个CPU读到的缓存就无效,需要等候其他CPU把变量处理完才能重新处理这个变量,这样一来一回就导致两个CPU的核心没法真正的并发执行一段代码。

 

4.4优化任务依赖

在一个系统中,会存在一个业务强依赖另一个业务的完成才能继续工作,在队列处理数据时也一样,如果我们想两个业务能良好的进行下去,那么就需要建两个队列去完成这个任务,第一个队列在不断的出队来完成它的业务,接着把出队的数据丢给第二队列让它完成接下去的工作;在Disruptor中我们只需要一个RingBuffer就可以解决这个问题。

 

5. 原理

 

6. 使用

 

7. 结论

Disruptor可以帮助我们更好的完成工作,在高并发低延迟方面表现的非常好。

 

8. 展望

既然有这个好的模型和框架,当然我们就想要把他应用到我们的项目中,我们讨论过flume里面channel 作为一个缓冲,底层用的是一个LinkedBlockingDeque,所以大家都认为他效率低,那么我们是否可以使用Disruptor来对这个进行优化呢?

当然Disruptor作为一个生产消费模型非常好的实现方案其他地方也是可以用到的。

十五、寻龙队列术——Disruptor+Redis 队列 Disruptor 是 LMAX 开源的高性能异步处理框架,提供了高性能的无锁内存队列实现,并优化了 CPU 伪共享,旨在构建低延迟、高吞吐量的交易型应用。Disruptor 可以用于构建复杂的任务工作流,下面是一个消费者工作流的示意图:在实际项目中,我们将 Disruptor 与 Redis 结合,用于异步处理任务。整体架构如下图所示:Redis 队列:我们使用 Redis List 数据结构来存储任务,并分为等待队列、本地处理队列、失败队列、备份队列。 阅读详情

相关推荐

disruptor源码解读

disruptor经过几年的发展,似乎已经成为性能优化的大杀器,几乎每个想优化性能的项目宣称自己用上了disruptor,性能都会呈现质的跃进。毕竟,最好的例子就是LMAX自己的架构设计,支撑了600w/s的吞吐。   本文试图从代码层面将关键问题做些解答。   基本概念   Disruptor: 实际上就是整个基于ringBuffer实现的生产者消费者模式的容器。   RingBuf

笨狐狸 5337

高性能线程间队列 DISRUPTOR 简介

disruptor简介 背景 Disruptor是英国外汇交易公司LMAX开发的一个高性能队列,研发的初衷是解决内存队列的延迟问题。与Kafka(Apache Kafka)、RabbitMQ(RabbitMQ)用于服务间的消息队列不同,disruptor一般用于线程间消息的传递。基于Disruptor开发的系统单线程能支撑每秒600万订单,2010年在QCon演讲后,获得了业界关注。2011年...

weixin_30797027的博客 297

大模型辅助意图识别,更懂你的客户洞察平台

通过大量的学习和训练,大模型不仅具备庞大的知识库,更掌握着丰富的语言模式和语义规则,能够精准地理解每一段对话的含义,为每一通对话进行全面、准确的标注。主要来自客户的行为信息,将客户与机构的重要时刻以时间轴的方式呈现出来,掌握客户生命周期的完整脉络,识别一些容易被忽略的重要营销MOT(Moment Of Truth,关键时刻研究)机会,提示理财经理跟进处理。将客户的历史交易数据和埋点系统采集的客户行为数据结合起来,辅以部分内容资讯的偏好探测,综合分析和预测客户在各个维度的喜好程度,实现千人千面的客户推送。

Dezhuzhineng的博客 2159

Disruptor思想学习

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

xjk201的博客 1289

SKF SimPro Quick 4.8.1发布

发布说明可以在SimPro手册的SKF SimPro Quick应用程序的一般部分下找到(帮助→SKF SimPro快速手册→一般→发布说明)。请删除旧版本,请备份您存储在C:\SKF SimPro xxx\files文件夹中的文件以及所有自定义报告模板和表格。我们很高兴地通知您,我们的轴承应用工程软件SKF SimPro Quick 4.8.1可供下载。将新的安装文件下载到本地计算机后,双击它安装向导将打开(按照说明操作)3.安装后,在本地机器上启动SKF SimPro Expert软件。

小韩的博客 1820

ubuntu20.04开机黑屏卡在/dev/sda1:clean,***files,***blocks,解决心得记录

这个问题如果你百度,会发现目前有很多种解决方法。 有更新显卡驱动的,有卸载上一次安装软件的,还有各种奇奇怪怪的故障原因。 如果你是属于上述情况,那么按照百度和论坛的各种指引操作一般都能解决。 但我这里主要说一种特殊情况,就是我什么也没有操作,我什么也没干。就是正常使用系统关了机突然就报错了。 这也是自己亲自遇到的问题,做个小记录方便以后自己回顾。 上一次出现这种情况我重装系统了,这次用了两个月又出现了,重装成本太高,我接受不了,于是找到解决办法。 首先找个终端进入,进入终端的方法很多,用安装u盘

qq_41517017的博客 2万+

Disruptor(一)Disruptor概念和RingBuffer数据结构

Disruptor是LMAX公司开源的一个高效的内存无锁队列。 谈到并发程序设计,有几个概念是避免不了的。 1、锁: 锁是用来做并发最简单的方式,当然其代价也是最高的。内核态的锁的时候需要操作系统进行一次上下文切换,等待锁的线程会被挂起直至锁释放。在上下文切换的时候,cpu之前缓存的指令和数据都将失效,对性能有很大的损失。用户态的锁虽然避免了这些问题,但是其实它们只是在没有真实的竞争时才有效。 2、CAS: CAS的涵义不多介绍了。使用CAS时不像上锁那样需要一次上下文切换,但是也需要处理器锁住它的指令流水

Mr_沉溺的博客 914

OpenFOAM高效学习路线:如何用B站+东岳流体3个月掌握CFD仿真

本文分享了一套高效的OpenFOAM学习路线,结合B站视频、东岳流体教程和官方文档,帮助在职工程师在3个月内掌握CFD仿真技术。通过渐进式学习计划和案例训练,从基础到实战,快速提升独立建模能力。

weixin_29202213的博客 319

600万订单每秒Disruptor +SpringBoot,如何解决消息不丢失?

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

架构师尼恩 3728

谷粒商城学习笔记-15-数据库初始化

这一节的主要内容是把创建对应的数据库和数据库表。

epitomizelu的专栏 1438

以太网硬件核心:MAC、PHY、MII与交换机原理与实战排查

计算机网络通信的基础依赖于一套完整的硬件协议栈。在OSI模型中,数据链路层和物理层是实现设备间可靠、高效数据传输的基石。其核心原理在于将上层数据包封装成帧,并通过特定的介质访问控制与物理信号转换机制进行传输。这一过程的技术价值在于为上层应用提供了透明、稳定的通信信道,是互联网和所有局域网通信的物理承载。在嵌入式系统、网络设备开发及运维等应用场景中,深入理解底层硬件交互至关重要。本文将聚焦于以太网硬件的两大核心组件:负责逻辑成帧与流量控制的MAC控制器,以及负责数模转换与链路协商的PHY芯片。它们通过MII、

dgqvhtlwq472235338的博客 423

Disruptor 消费线程丢失、写入无限阻塞问题

Disruptor 消费线程丢失、写入无限阻塞问题

u014551778的博客 1968

【AI Agent】Harness Engineering实践

Harness(运行宿主)是围绕 LLM构建的一套确定性工程系统,其核心职责是:承认模型的固有局限,用可控的工程手段逐一弥补,使"强大但不可靠的推理引擎"变成"可信赖的生产级Agent"模型 是发动机——提供原始动力Agent 是驾驶员——做出决策Harness 是道路、地图、护栏、仪表盘、维修站和质检线——确保行驶安全有序没有Harness,模型越强,可能只是更快地制造混乱。

sysu_lluozh 192

Disruptor中遇到的坑

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

software2005的专栏 1万+

华为OD机试 新系统真题-收集灵草(Java/Py/C++/Go/C/Js)

华为OD机试 新系统真题【收集灵草】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【收集灵草】多语言题解。

qq_45776114的博客 551

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【Disruptor技术调研之开源组件Canal如何应用Disruptor组件】

这篇文章主要分享通过阿里开源组件Canal源码去剖析大佬们(或者说前辈们)是如何去应用Disruptor组件的,以及我们在实际业务场景有哪些是我们可以借鉴和使用的!

whatjeans的博客 1563

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Disruptor详解

LMAX是一种新型零售金融交易平台,它能够以很低的延迟产生大量交易。这个系统是建立在JVM平台上,其核心是一个业务逻辑处理器,它能够在一个线程里每秒处理6百万订单。业务逻辑处理器完全是运行在内存中,使用事件源驱动方式。业务逻辑处理器的核心是Disruptor。 Disruptor它是一个开源的并发框架,并获得2011 Duke’s 程序框架创新奖,能够在无锁的情况下实现网络的Queue并发操作。 Disruptor是一个高性能的异步处理框架,或者可以认为是最快的消息框架(轻量的JMS),也可以认为是一个观察

JavaEdge全是干货的技术号 5799

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Disruptor概览

一文简短的文章帮助你掌握Disruptor设计原理

阿呆的专栏 858

disruptor笔记之二:Disruptor类分析

最后总结Disruptor类的重要功能:创建环形队列(RingBuffer对象)创建SequenceBarrier对象,用于接收ringBuffer中的可消费事件创建BatchEventProcessor,负责消费事件绑定BatchEventProcessor对象的异常处理类调用ringBuffer.addGatingSequences,将消费者的Sequence传给ringBuffer启动独立线程,用来执行消费事件的业务逻辑。

2501_90472525的博客 828

Disruptor详细介绍

Disruptor详细介绍

qq_44073614的博客 3562

Disruptor面试宝典

Disruptor面试题 1.什么是 Disruptor?它有哪些特点? 2.Disruptor 如何实现无锁并发?它的核心原理是什么? 3.Disruptor 的优缺点是什么? 4.Disruptor 中的 RingBuffer 是什么?有哪些作用? 5.Disruptor 中的 Sequence 是什么?有哪些作用? 6.Disruptor 中的 EventProcessor 是什么?有哪些作用?

识时务者的个人博客 15万+

Disruptor系列3:Disruptor样例实战

章节回顾: - Disruptor系列1:初识Disruptor - Disruptor系列2:Disruptor原理剖析 本章节是Disruptor样例实战,依据Disruptor的工作流依次执行的特性,实现各种样例。如果想了解Disruptor是什么,可以查看章节 Disruptor系列1:初识Disruptor ,如果想深层次了解Disruptor,可以查看章节 Disruptor系...

Coding Road 1万+

Disruptor入门

Disruptor是一个高性能的异步处理框架,它能在一个线程里每秒处理6百万订单,业务逻辑完全是运行在内存中,使用事件源驱动方式,业务逻辑处理器的核心是Disruptor。

码畜成神记 1193

Disruptor的使用以及原理

Disruptor是一种高性能的并发框架,用于解决在高并发场景下的数据交换和协调问题。通过无锁的环形缓冲区和批量处理的方式,实现了更高的吞吐量和更低的延迟。它适用于需要处理大量并发事件的场景,如高频交易系统、消息队列等。

qq_39939541的博客 4549

深入理解Disruptor-rs:LMAX Disruptor的Rust实现原理详解

Disruptor-rs是一个基于Rust语言实现的低延迟线程间通信库,灵感来源于LMAX Disruptor。它通过无锁环形缓冲区(RingBuffer)设计,为开发者提供了高性能的并发数据传递方案,特别适用于需要高吞吐量和低延迟的实时系统场景。 ## 🌟 Disruptor-rs的核心优势 ### 🔹 无锁设计带来的性能突破 Disruptor-rs采用无锁环形缓冲区(RingBuff

gitblog_00959的博客 333
上一篇: hive-udaf GroupConcat
木鱼似鲸
博客等级 码龄15年 0粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值