Disruptor架构源码详解

Disruptor是一个高性能的线程间通信库,单线程处理能力可达每秒600万订单。其核心是RingBuffer的无锁设计,结合CAS指令避免线程竞争,利用CPU缓存提升效率。文章介绍了Disruptor的伪共享问题、锁与CAS的性能差异,以及producer和consumer的工作流程,揭示了其高性能的原因,包括无锁化、避免伪共享、预填充RingBuffer、WaitStrategy策略等优化手段。
摘要由CSDN通过智能技术生成

Disruptor简介

Disruptor是LMAX交易所开源的一个用于线程间通信高性能代码库。基于Disruptor开发的系统单线程能支撑每秒600万订单的处理。Disruptor主要通过RingBuffer的环形数据设计来避免垃圾回收,同时最大化地利用CPU的缓存机制。另外一方面就是使用无锁设计,充分利用现代计算的CAS指令,保证线程安全。

背景知识

伪共享

伪共享指的是两个线程分布修改不同变量的值,由于不合理的设计导致两个互不相关的变量位于同一个缓存行里面,进而引发缓存行的失效,导致的不必要的竞争,从而影响性能的现象。参考知识:MESI协议CPU缓存CPU与计算机其他部件的交互时间java的魔法类Unsafe

锁、CAS、无锁的性能差异

首先需要明白的是带锁的操作性能是很差。CAS的性能比带锁的操作性能要好很多,但是会对CPU造成大量的浪费。无锁操作的性能是最好的,但是不能保证多线程的安全。对于有兴趣的朋友,可以自己测试一下。

Disruptor整体架构

Disruptor的核心类图
在这里插入图片描述各个图的交互概览入下所示:
在这里插入图片描述

1、producer流程

对于单生产者的模式,由于不涉及多线程的竞争,故我们只需要保证,生产者的生产速度不要太快,而consumer来不及消费,产生的竞争。核心代码也比较简单
在这里插入图片描述只是增加了cache,封装了一层逻辑而已。

对于多producer的情况,稍微比单producer复杂一点,增加了producer之间的竞争。核心代码如下:
在这里插入图片描述

2、consumer流程

consumer通过SequenceBarrier与RingBuffer交互,SequenceBarrier的实现类ProcessingSequenceBarrier的核心代码如下:
在这里插入图片描述这个代码实现了,consumer与producer之间的平衡,也实现串联consumer之间的关系。

consumer和producer类似,consumer的标志是EventProcessor。Disruptor实现了两种情况常见的消息模式:广播、组播。
广播是指每条消息都会被所有的消费者单独处理。
通过BatchEventProcessor实现,代理EventHandler处理实际的业务逻辑,核心逻辑:
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值