一、并发框架disruptor-介绍

余生长醉 提交于 2019-12-01 01:43:32

1、背景

Martin Fowler在自己网站上写了一篇LMAX架构的文章,在文章中他介绍了LMAX是一种新型零售金融交易平台,它能够以很低的延迟产生大量交易。这个系统是建立在JVM平台上,其核心是一个业务逻辑处理器,它能够在一个线程里每秒处理6百万订单。业务逻辑处理器完全是运行在内存中,使用事件源驱动方式。业务逻辑处理器的核心是Disruptor。

2、什么是distruptor

  • Disruptor它是一个开源的并发框架,并获得2011 Duke’s 程序框架创新奖,能够在无锁的情况下实现网络的Queue并发操作。

  • 可以简单理解为一种高效的"生产者-消费者"模型,性能远远高于传统的BlockingQueue容器。在JDK的多线程与并发库一文中, 提到了BlockingQueue实现了生产者-消费者模型。BlockingQueue是基于锁实现的, 而锁的效率通常较低。没有使用CAS机制实现的生产者-消费者。Disruptor使用观察者模式, 主动将消息发送给消费者, 而不是等消费者从队列中取;在无锁的情况下, 实现queue(环形, RingBuffer)的并发操作, 性能远高于BlockingQueue。

下面介绍两者的差异性
将从下面几种线程情况下测试BlockingQueue和disruptor的吞吐量和性能测试。
在这里插入图片描述

对比测试结果
吞吐量结果
在这里插入图片描述
性能延迟测试结果
在这里插入图片描述
由上面的测试结果分析,并发竞争的激烈程度的不同,Disruptor比ArrayBlockingQueue吞吐量快4~7倍。按照Pipeline: 1P – 3C的连接模式测试延迟,生产者两次写入之间的延迟为1ms。这是因为ArrayBlockingQueue是通过加锁的方式保证线程安全,而且ArrayBlockingQueue还存在伪共享问题,这两个问题严重影响了性能,disruptor除了解决这两个问题之外,还引入了下面几种方式提升性能。

  • 引入环形的数组结构:数组元素不会被回收,避免频繁的GC,
  • 无锁的设计:采用CAS无锁方式,保证线程的安全性
  • 属性填充:通过添加额外的无用信息,避免伪共享问题
  • 元素位置的定位:采用跟一致性哈希一样的方式,一个索引,进行自增
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!