高性能线程间消息传递库Disruptor概述

Disruptor是一个高性能的线程间消息传递库。它源于LMAX对并发性 、性能和非阻塞算法的研究,如今构成了其Exchange基础架构的核心部分。

理解Disruptor是什么的最好方法是将它与目前已经的很好理解和非常相似的东西进行比较,例如与Java的BlockingQueue进行对比。与队列一样,Disruptor的目的是在同一进程内的线程之间传递数据(例如消息或事件)。但是Disruptor相比传统JDK中的队列提供了一些关键功能,它们是:

  • Disruptor中的同一个消息会向所有消费者都发送-即多播能力。
  • 为事件(events)预先分配内存,避免频繁垃圾回收与内存分配开销。
  • 可选择无锁(lock-free),基于CAS操作让多个生产者不会竞争同一个元素,实现无锁操作元素。
  • 使用两阶段协议,让多个线程可同时修改不同元素,需要注意的是消费元素时候只能读取到已经提交的元素。
  • 缓存行填充,避免伪共享。

多播能力是Java中队列和Disruptor之间最大的行为差异。当您有多个消费者在同一个Disruptor上监听事件时候,所有事件都会发布给所有消费者,而Java队列中的每个事件只会发送给某一个消费者。 Disruptor的行为旨在用于需要对同一数据进行独立的多个并行操作的情况。

Disruptor的目标之一是在低延迟环境中使用,在低延迟系统中,必须减少或移除内存分配;在基于Java的系统中,目的是减少由于垃圾收集导致的系统停顿;为了支持这一点,用户可以预先分配Disruptor中事件所需的存储空间(也就是声明RingBuffer的大小)。在构造RingBuffer期间,EventFactory由用户提供,并将在Disruptor的Ring Buffer中每个事件元素创建时候被调用。将新数据发布到Disruptor时,API将允许用户获取构造的对象,以便他们可以调用方法或更新该存储对象上的字段,Disruptor保证这些操作只要正确实现就是并发安全的。

低延迟期望推动的另一个关键实现细节是使用无锁算法来实现Disruptor;所有内存可见性和正确性保证都是使用内存屏障(体现为volatile)或CAS操作实现的;在Disruptor的实现中只有一个情况需要实际锁定,这就是当使用BlockingWaitStrategy策略时候,这仅仅是为了使用条件变量,以便在等待新事件到达时前parked消费线程。许多低延迟系统将使用忙等待busy-wait 来避免使用条件可能引起的抖动,但是大量在系统繁忙等待的操作可能导致性能显着下降,尤其是在CPU资源严

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值