`
wbj0110
  • 浏览: 1604682 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

LMAX Disruptor——一个高性能、低延迟且简单的框架(转)

阅读更多

Disruptor是一个用于在线程间通信的高效低延时的消息组件,它像个增强的队列,并且它是让LMAX Exchange跑的如此之快的一个关键创新。关于什么是Disruptor、为何它很重要以及它的工作原理方面的信息都呈爆炸性增长 —— 这些文章很适合开始学习Disruptor,还可跟着LMAX BLOG深入学习。这里还有一份更详细的白皮书

 

虽然disruptor模式使用起来很简单,但是建立多个消费者以及它们之间的依赖关系需要的样板代码太多了。为了能快速又简单适用于99%的场景,我为Disruptor模式准备了一个简单的领域特定语言。例如,为建立一个消费者的“四边形模式”:

(从Trisha Gee’s excellent series explaining the disruptor pattern偷来的图片)

在这种情况下,只要生产者(P1)将元素放到ring buffer上,消费者C1和C2就可以并行处理这些元素。但是消费者C3必须一直等到C1和C2处理完之后,才可以处理。在现实世界中的对应的案例就像:在处理实际的业务逻辑(C3)之前,需要校验数据(C1),以及将数据写入磁盘(C2)。

用原生的Disruptor语法来创建这些消费者的话代码如下:

01 Executor executor = Executors.newCachedThreadPool();
02 BatchHandler handler1 = new MyBatchHandler1();
03 BatchHandler handler2 = new MyBatchHandler2();
04 BatchHandler handler3 = new MyBatchHandler3()
05 RingBuffer ringBuffer = new RingBuffer(ENTRY_FACTORY, RING_BUFFER_SIZE);
06 ConsumerBarrier consumerBarrier1 = ringBuffer.createConsumerBarrier();
07 BatchConsumer consumer1 = new BatchConsumer(consumerBarrier1, handler1);
08 BatchConsumer consumer2 = new BatchConsumer(consumerBarrier1, handler2);
09 ConsumerBarrier consumerBarrier2 =
10 ringBuffer.createConsumerBarrier(consumer1, consumer2);
11 BatchConsumer consumer3 = new BatchConsumer(consumerBarrier2, handler3);
12 executor.execute(consumer1);
13 executor.execute(consumer2);
14 executor.execute(consumer3);
15 ProducerBarrier producerBarrier =
16 ringBuffer.createProducerBarrier(consumer3);

在以上这段代码中,我们不得不创建那些个handler(就是那些个MyBatchHandler实例),外加消费者屏障,BatchConsumer实例,然后在他们各自的线程中处理这些消费者。DSL能帮我们完成很多创建工作,最终的结果如下:

1 Executor executor = Executors.newCachedThreadPool();
2 BatchHandler handler1 = new MyBatchHandler1();
3 BatchHandler handler2 = new MyBatchHandler2();
4 BatchHandler handler3 = new MyBatchHandler3();
5 DisruptorWizard dw = new DisruptorWizard(ENTRY_FACTORY,
6     RING_BUFFER_SIZE, executor);
7 dw.consumeWith(handler1, handler2).then(handler3);
8 ProducerBarrier producerBarrier = dw.createProducerBarrier();

我们甚至可以在一个更复杂的六边形模式中构建一个并行消费者链:

1 dw.consumeWith(handler1a, handler2a);
2 dw.after(handler1a).consumeWith(handler1b);
3 dw.after(handler2a).consumeWith(handler2b);
4 dw.after(handler1b, handler2b).consumeWith(handler3);
5 ProducerBarrier producerBarrier = dw.createProducerBarrier();

这个领域特定语言刚刚诞生不久,欢迎任何反馈,也欢迎大家从github上fork并改进它。

分享到:
评论

相关推荐

    串行io disruptor

    《Disruptor:高性能的并发数据交换机制》 在构建高效率金融交易平台LMAX的过程中,开发者面临了如何优化数据在并发线程间交换的问题。传统的队列方式在处理并发数据交换时,其延迟成本与磁盘I/O操作相当,这对追求...

    disruptor 实例

    Disruptor,由英国LMAX公司开源的一款高性能、低延迟的消息处理框架,它彻底改变了并发编程的传统模式,尤其在金融交易领域,其性能表现卓越,被誉为“游戏规则的改变者”。本文将深入探讨Disruptor的核心原理,并...

    Disruptor学习(1)

    Disruptor是英国LMAX公司开发的一个开源并发框架,其设计目标是为了提供极低延迟的并发处理能力。在金融交易系统等领域,对于高频率、低延迟的需求尤为重要,Disruptor就是为了解决这个问题而诞生的。这篇博客将带领...

    DisruptorDemo.zip

    Disruptor,由LMAX公司开发并开源,是一款高性能、低延迟的并发工具,主要用于优化多线程间的通信。它采用一种环形缓冲区(Ring Buffer)的设计,极大地提高了并发处理性能,尤其在高频率交易系统中表现卓越。本篇...

    Disruptor应用实例

    Disruptor是高性能并发编程领域的一个重要工具,由LMAX公司开发并开源,主要用于优化多线程环境下的数据处理。它通过一种创新的数据同步方式,极大地提升了系统的吞吐量和响应速度。在本文中,我们将深入探讨...

    disruptor:LMAX干扰器的C++实现

    LMAX Disruptor是由LMAX公司开发的一款高性能、低延迟的消息传递框架,最初是用Java编写的。它的核心设计理念是通过消除传统锁机制,采用无锁数据结构和单向事件传递路径,以达到极致的并发性能。在本文中,我们将...

    disruptor-3.2.1.zip

    Disruptor-3.2.1是由LMAX公司开发并开源的一款高性能的并发框架,其核心是一个环形缓冲区(Ring Buffer)。这个框架的设计理念是消除多线程之间的锁竞争,从而大幅度提高系统的处理速度。在3.2.1版本中,Disruptor...

    高性能高稳定性分布式的游戏架构,游戏逻辑运行在Disruptor消费者线程中,其它线程都为辅助线程, 整体为多生产者.zip

    Disruptor是由LMAX公司开源的一个高性能并发工具,它提供了一个低延迟、高吞吐量的消息传递机制。Disruptor通过消除锁和最小化内存交互,极大地提高了多线程环境下的性能。在游戏项目中,将游戏逻辑放在Disruptor...

    Java_高性能线程间消息传递库.zip

    Disruptor是由LMAX公司开发的一个开源框架,它通过一种叫做“环形缓冲区”(Ring Buffer)的数据结构,提供了比传统同步机制如锁更高的性能和更低的延迟。环形缓冲区是一种固定大小的数组,线程间通过该数组传递消息...

    Disruptor学习.7z

    Disruptor,由LMAX公司开源,是一个高性能的并发编程框架,主要用于解决多线程间的通信问题,尤其是在高并发场景下,能够显著提高系统性能。在Java网络技术领域,Disruptor以其独特的环形缓冲区(Ring Buffer)设计...

    myDisruptor.zip

    Disruptor是英国LMAX公司开发的一款高性能、低延迟的并发处理框架,它通过优化内存访问模式和避免锁竞争,实现了高效的多线程间通信。本文将结合提供的myDisruptor.zip资源,深入解析Disruptor的工作原理和应用。 ...

    disrupter的使用简单demo

    Disruptor是由LMAX公司开发的一款高性能的并发框架,它主要应用于高并发场景下的数据处理,以提供极低的延迟和高效的性能。Disruptor基于环形缓冲区(Ring Buffer)的设计,通过消除传统并发编程中的锁竞争,实现了...

    破坏者:高性能线程间消息传递库

    《破坏者:高性能线程间消息传递库——深入解析LMAX Disruptor》 LMAX Disruptor,作为一款高效能的线程间消息传递库,由英国金融技术公司LMAX开发并维护,其设计目标是优化多线程环境下的数据共享与通信,尤其在高...

    disruptor-starter:干扰器的使用示例

    Disruptor,由LMAX公司开发并开源,是一款高性能、低延迟的并发工具,主要用于优化多线程间的通信。它采用一种新颖的环形缓冲区设计,极大地提升了并发性能,避免了锁竞争和数据同步带来的性能瓶颈。在Java世界中,...

    LMAXAbstractQueue

    LMAX Disruptor,作为一个高性能、低延迟的消息处理框架,正是为了解决这类问题而设计的。本文将深入探讨其核心组件之一——LMAXAbstractQueue,一个无锁的队列实现,它在高频率交易(HFT)场景下发挥着至关重要的...

    disruptorqueue:基于干扰器 RingBuffer 的阻塞队列实现

    Disruptor是一个由LMAX公司开发的高性能并发库,它提供了一种创新的解决方案——基于RingBuffer的阻塞队列。这种实现方式能够极大地提高多线程环境下的数据处理速度,降低锁竞争,从而优化系统性能。本文将深入探讨...

Global site tag (gtag.js) - Google Analytics