原文地址: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语法来创建这些消费者的话代码如下:
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并改进它。
LMAX Disruptor——一个高性能、低延迟且简单的框架相关推荐
- Kudu - 一个融合低延迟写入和高性能分析的存储系统
Kudu 是一个基于 Raft 的分布式存储系统,它致力于融合低延迟写入和高性能分析这两种场景,并且能很好的嵌入到 Hadoop 生态系统里面,跟其他系统譬如 Cloudera Impala,Apac ...
- 高性能低延迟无线蓝牙耳机,国产高人气时尚真无线蓝牙耳机测评
说到无线蓝牙耳机大家绝对不陌生,作为目前人们非常喜爱的音乐电子产品,特别是很多旗舰手机取消了3.5mm耳机孔后,真无线蓝牙耳机因为灵活性和便捷程度得到了消费者普遍认可,很多厂商也适时推出了自家的真无线 ...
- 还在烦恼玩吃鸡不能听声辨位?这五款高性能低延迟蓝牙耳机助你吃鸡!
生活节奏越来越快,很多年轻人喜欢听音乐来放松自己,音符是自由无界的,那么作为年轻人连接音乐世界的桥梁当然就是耳机了,这也理所应当不受束缚.正因如此,真无线蓝牙耳机产品大行其道,在生活里占据了越来越大的 ...
- 蓝牙耳机哪款好用?2020高性能低延迟游戏蓝牙耳机推荐
现代人的生活越来越追求便捷了,手机,支付,购物都是怎么方便怎么来,就连大家出门必备的耳机开始流行用"蓝牙耳机"了,不过随着科技技术的不断发展,从小众到大众,从百元到千元,琳琅满目的 ...
- 拥有一个高性能低延时数据库是什么样的体验?
本文分享自华为云社区<数据为证,华为云GaussDB(for Cassandra) 性能提升背后的那些事儿>,原文作者:高斯Cassandra官方. 在我们的日常理念中,追求性价比是最为常 ...
- 日常TWS蓝牙耳机选购要注意什么?百元级高性能低延迟蓝牙耳机推荐
近年来,无论是广场舞还是长跑,无论是大家庭.小情侣,阿姨还是中小学生,体育和健身在大江南北都很受欢迎,并被热情追捧.说到运动,耳机自然是不可或缺的,所以如何选择一款合适的蓝牙运动耳机已经成为许多消费者 ...
- Salsify: 低延迟的网络视频框架设计--视频编解码器和传输协议的紧密集成
本文出自论文Salsify: Low-Latency Network Video through Tighter Integration between a Video Codec and a Tra ...
- 一种低延迟的超时中心实现方式
简介: 在很多产品中都存在生命周期相关的设计,时间节点到了之后需要做对应的事情.超时中心(TimeOutCenter,TOC)负责存储和调度生命周期节点上面的超时任务,当超时任务设置的超时时间到期后, ...
- web flash rtmp_基于RTMP和WebRTC开发大规模低延迟(1000毫秒内)直播系统
问题 随着移动设备大规模的普及以及流量的资费越来越便宜, 超低延迟的场景越来越多. 从去年到今年火过的场景就有在线娃娃机, 直播答题, 在线K歌等. 但要做到音视频的超低延迟确是很不容易, 编码延迟, ...
- Java—实现 IOC 功能的简单 Spring 框架
编写一个实现 IOC 功能的简单 Spring 框架,包含对象注册.对象管理.及暴 露给外部获取对象的功能,并编写测试程序.扩展注册器的方式,要求采用 XML 和 txt 文件. 源代码 packag ...
最新文章
- Android窗口管理服务WindowManagerService计算窗口Z轴位置的过程分析
- Linux常用编辑器使用:vi、vim、nano、gedit
- mysql 导出用户权限_MySQL中导出用户权限设置的脚本分享
- 技术系列课|网易云信音视频通话2.0产品中的美声/变声功能
- VTK:几何对象之ColoredLines
- linux指令快速复制粘贴[龟速更新中]
- nssl1192-加密【字符串hash】
- 数据分析工具该如何选择
- 分析JQ作者的类实现过程
- web安全day18:kali下的两个实验彻底理解中间人攻击
- mysql 历史记录查询
- python实现逆序输出一个数字
- Lucas(卢卡斯)定理---组合数取模问题
- 萤石云摄像头方向操控前端代码
- 肖飒:区块链应用创业的法律边界及案例分析 | 清华x-lab公开课
- ios 企业签 plist 安装 通用模板
- luci html 页面,luci更改登录账号.htm
- 计算机网络的ask表示啥,计算机网络理论知识:物理层
- 《一键下单:杰夫·贝佐斯与亚马逊的崛起》—— 读后总结
- java8时间间隔计算_Java8中Instant和LocalDate来计算时间或者日期间隔
热门文章
- springboot底层原理简述
- Linux 内存泄漏检查工具 valgrind
- P1373 小a和uim之大逃离
- Dockerfile 中的 CMD 与 ENTRYPOINT
- 20170724 Airflow官网资料学习
- 4.3.8 使用模板
- Linux系统中打开文件数量的查看方法
- 不是我发现了美,只不过这个世界本身就很美。记快乐的今年生日。
- AngularJS transclude 理解及例子
- Django自身安全机制-XSS和CSRF