最新消息:

Disruptor框架初学(一)

java 老鹰 365浏览 0评论

LMAX的 Disruptor 是一个高性能的并发框架,与LinkedBlockingQueue类似,提供了一个高速的生产者消费者模型,广泛用于批量IO读写,在硬盘读写相关的程序中应用的十分广泛,Apache旗下的HBase、Hive、Storm等框架都有在使用Disruptor。(注,本文Disruptor基于3.3.6版本)

     主要从如下几点进行了优化:

1. 无锁机制(确保任何数据只由一个线程拥有以进行写访问,从而消除写争用的设计,通过字节填充实现, 这种设计被称作“破坏者”,也是这样命名这个框架的)。
2. 没有CAS操作,避免了内存屏障指令的耗时。
3. 便是避开了CacheLine伪共享的问题,也是我们研究的主题

     核心类分析:

1. RingBuffer:底层由数组(private final Object[] entries;)来实现,数组在高速缓存中的友好型已经在上面介绍了,不再赘述。RingBuffer的类关系图如下:
1.RingBuffer
2.Sequencer:在RingBuffer构造函数里面存在这么一个Sequencer,用来遍历数据,传递数据在生产者和消费者之间。它有2个核心关键实现类:
1)MultiProducerSequencer 其类结构如下图。
2)SingleProducerSequencer 其类结构如下图。
2.MultiProducerSequencer


3.SingleProducerSequencer


3)两者的主要区别为:单生产者是在Cacheline中使用pading方式实现,而多生产者则是使用 sun.misc.Unsafe来实现的。
如下图:
4.differenceSingleAndMulti
3.Sequence:在多生产者模式中包含了此Sequence,初始Sequence时以“-1L”作为Sequence的起始点。同时使用了Padding方式来实现,如下为其类结构图及Padding的类。
5.Sequence
4.Sequence Barrier :是由Sequencer创建,用来处理任何的Event是否给消费者用。
包含如下2个Barrier实现类:
1)ProcessingSequenceBarrier
2)DummySequenceBarrier
下图展示了Sequencer如何创建了Barrier:
6.SequenceBarrier
5.Wait Strategy:等待策略是用来表示消费者是如何等待来自生产者的events 。
6.Event:是指被生产者传递给消费者的最小数据单位。
7.EventProcessor:是用来处理events。BatchEventProcessor便是实现一个高效的事件循环的实现类,需要一个EventHandler。
8.EventHandler:由开发人员来实现的如何处理数据的消费者。
9.Producer:生产者,有开发人员自行开发及配置。
如下为Disruptor的类图:
7.classgraph

Disruptor Demo 示例

如下代码 展示了在JDK8中如何使用Disruptor:
8.disruptor_demo_a

8.disruptor_demo_b

关于CacheLine的应用还有很多,jdk中有注解方式来使用

转载请注明:冯英胜的博客 » Disruptor框架初学(一)

发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址