打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
LMAX Disruptor

原文地址:LMAX Disruptor – High Performance, Low Latency and Simple Too 翻译:杨帆 校对:丁一

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语法来创建这些消费者的话代码如下:

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

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

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

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

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

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

原创文章,转载请注明: 转载自并发编程网 – ifeve.com

本文链接地址: LMAX Disruptor——一个高性能、低延迟且简单的框架

1

canesten

从小喜欢打游戏,现在在育碧写游戏,可是却不喜欢玩自己做的游戏,人在江湖身不由己。
希望能与同行们,尤其是游戏服务器开发领域的同行多多交流。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
LMAX-Exchange/disruptor
Disruptor的原理
架构师养成记
Disruptor高性能缓存队列入门指导
Disruptor复杂场景下使用RingBuffer
如何从 Ring Buffer 读取?
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服