Java工具:高性能并发工具Disruptor

问题:Disruptor是什么?

  • Disruptor是英国外汇交易公司LMAX开发的一个高性能队列,基于Disruptor开发的系统单线程能支撑每秒600万订单,2010年在QCon演讲后,获得了业界关注。
  • 应用:Apache Storm、Camel、Log4j 2等
  • 源码:https://github.com/LMAX-Exchange/disruptor

问题:Disruptor的核心原理是什么?

  • 与Java内置的并发队列类似
    • ArrayBlockingQueue
    • LinkedBlockingQueue等
  • Disruptor的核心就是一个环状存储容器:RingBuffer
    • 生产者-消费者模型:生产者向RingBuffer中写入元素,消费者从RingBuffer中消费元素。
  • Disruptor的构成工具:
    • 环状存储容器:RingBuffer
    • 消费者线程池Executor
    • 消费者集合ConsumerRepository
      在这里插入图片描述

问题:RingBuffer是什么?

  • 如上图所示,它是一个首尾相连的环状存储容器。
  • RingBuffer是基于数组的缓存实现,它是一个内存级别的容器
  • 它用作在不同上下文(线程)之间传递数据的容器,这点跟Java其他内置并发队列一致。
  • RingBuffer拥有一个序号,这个序号指向数组中下一个可用的元素。

问题:RingBuffer中的序号是什么,它如何维持平衡?

Sequence:

  • 序号:可以看成是一个AtomicLong用于标识进度,它是一个顺序递增的值,即使绕过了这个环还是会保持增长。
  • 获取数据位:通过对序号取模得出的余数获取位置。序号 % 环的总槽位 = 当前的槽位
  • 生产者与消费者对数据的处理过程总是沿着序号逐个递增。
  • 每个Consumer都会拥有一个序号,所有Producer共用一个序号。

Sequencer:

  • Sequencer是Disruptor中真正核心,它是一个序号还能消除CPU伪共享的问题(主要是防止不同序号的CPU伪共享)。
  • 主要实现生产者和消费者之间快速、正确地传递数据的并发算法。
  • 它有两个实现类:
    • SingleProducerSequencer:单生产者
    • MultiProducerSequencer:多生产者

Sequence Barrier:

  • 它主要的作用是保持生产者的生产速率与消费者的消费速率之间的平衡关系
  • 对生产者与消费者的等待与唤醒作用

问题:消费者消费过快时,等待生产者的策略是什么?

Disruptor的WaitStrategy提供策略,常用的策略如下:

  • BlockingWaitStrategy
    • 通过锁来实现
    • 最低效的策略
    • 但其对CPU的消耗最小。
    • 并且在各种不同的部署环境中能提供更加一致的性能表现。
  • SleepingWaitStrategy
    • 通过让线程执行空计算实现(计数)
    • 性能表现跟BlockingWaitStrategy差不多,对CPU消耗也类似
    • 但其对生产者线程的影响最小
    • 适合用于异步日志类似的场景
  • YieldingWaitStrategy
    • 通过不断让程序yield(让步),来实现
    • 性能最好,适合用于低延迟的系统,无锁并行
    • 在要求极高性能且时间处理线数小于CPU逻辑核心数的场景中,推荐使用此策略

问题:Disruptor支持哪些操作模式?

  • 串行操作
  • 并行操作
  • 多边形操作(最后数据汇总)

问题:Disruptor的多生产者多消费者模型是怎呀的?

  • 所有的生产者共用一个sequence,每个消费者有一个sequence
  • 每个消费者可能会拿一个以上的槽位进行处理
  • 生产者是否需要阻塞需要判断所有消费者的sequence的最小值是否等于生产者的sequence+1
  • 注意:所有槽位中都存有实例数据(预加载,属性为空),预加载的数据等待生产者进行处理加工。
    在这里插入图片描述

问题:Disruptor的性能为什么可以如此高?

  • 数据结构层面:使用唤醒结构、数组、内存预加载。
  • 使用单线程写方式、内存屏障。
  • 消除伪共享(填充缓存行)。
  • 序号栅栏和序号配合使用来消除锁和CAS。
  • 内存预加载:RingBuffer会在创建的时候,将所有的对象(属性为空)先创建出来放入到环状数据结构中。
  • 等待策略的高效。

简单使用:

  • https://download.csdn.net/download/k295330167/18355172

参考

https://tech.meituan.com/2016/11/18/disruptor.html
https://www.cnblogs.com/cyfonly/p/5800758.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

萌白在努力

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值