高性能的异步处理框架Disruptor(四)——Disruptor2.0的优化

现在读者应该能理解如下运行流程图了。如何还看不懂,则需要回顾上篇文章 Disruptor消费者的依赖关系
在这里插入图片描述
Disruptor2.0主要变化有 3 点:

  • 更贴切的命名;
  • 把 producer barrier(生产者屏障)整合进了 ring buffer;
  • 将 Disruptor Wizard 加入了主代码库。

对于上图的实现方案,在新版本的结构图大概如下:

在这里插入图片描述

可以看到新版本更加简约,ProducerBarrier 本身不再作为一个单独的实体存在,它的替代者是 PublishPort 接口,且 RingBuffer 自身就实现了这个接口。 同样DependencyBarrier 替代 ConsumerBarrier 。另外,Publisher (Producer的替代者)和 EventProcessor(替代了Consumer) 更能精确地体现出它们的行为。Consumer 这个名字总是会带来一些混淆,因为因为其 实消费者从来不从 RingBuffer 消费任何东西。Consumer 之前仅仅是用于队列实现的一个术语。

图上没有表现出来的变动是以前存在 RingBuffer里的东西叫entry,而现在改名叫Event(事件)了,相应的就是 EventProcessor(事件处理者)。
整个命名上的大规模更改是为了让大家更清晰的明白 Disruptor 是如何工作的,以及该如何使用它。

在 2.0 版中为了性能提升引入了一个新对象 Sequence(序列),它被用来搞缓存行填充,并消除了对内存屏障的需要(happend-before)。现在缓存行填充的做法和以前略有不同,因为 JAVA7 新的优化特性,它成功的“优化”掉了我们原来的技术方案。

接下来,我们来看看前文说的加入了主代码库的DisruptorDisruptor

对于上述的菱形依赖关系,在DisruptorWizard下实现会非常容易

//创建DisruptorWizard
DisruptorWizard dw = new DisruptorWizard( ENTRY_FACTORY,
RING_BUFFER_SIZE,
EXECUTOR, ClaimStrategy.Option.SINGLE_THREADED, WaitStrategy.Option.YIELDING);

//创建只会写入FIZZ字段的EventHandler
FizzBuzzEventHandler fizzHandler =
new FizzBuzzEventHandler(FIZZ);
FizzBuzzEventHandler buzzHandler =
new FizzBuzzEventHandler(BUZZ);
FizzBuzzEventHandler fizzBuzzHandler =
new FizzBuzzEventHandler(FIZZ_BUZZ);

//fizzHandler, buzzHandler处理完后交给fizzBuzzHandler
dw.handleEventsWith(fizzHandler, buzzHandler) .then(fizzBuzzHandler);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值