Disruptor-架构思维的转变
相对于无锁技术,Disruptor对于架构思维的转变,才是其最大亮点。
Pub Event
说到RingBuffer做的队列,通常都说的是“一读一写“,或者“多读一写“。而Disruptor天生是为“广播“设计,也就是1个Producer,多个Consumer消费同1条消息。
有了“广播“,就能很好的支持不同逻辑模块的并行计算,从而提高性能。下面会专门分析一个案例,来讨论这个并行计算。
Consumer依赖关系维护
假设有如下一个场景:1个生成者P1,3个消费者C1, C2, C3。其中C3要依赖C1, C2执行完毕。如果基于传统的消息队列来设计,就会是如下的菱形结构:
之间用4个队列来连接,从P1流经到C3,要经过这4个队列。
而如果用Disruptor的话,将只需要一个RingBuffer,3个consumer都消费这同1个RingBuffer,如下图所示:
在这里,有几个关键点:
(1)C1, C2, C3消费的是同一个RingBuffer,因为进度不一样,它们各自有自己的指针,称之为Sequence。这里假设为S1, S2, S3
(2)C3是要依赖C1, C2的,也就是它要等C1, C2消费完之后,它才能消费。因此S3取的是Min(S1, S2)。
(3)假设P1的指针是S0,P1只需要和S3比较就行了,而不需要和S1, S2比较。因为S3是消费最慢的,只要P1没有跟上S3,那么队列就不会被覆盖。
依赖关系的表达
具体到Disruptor中,如何表达C3依赖C1, C2呢?代码举例如下,很简单:
//handler1, 2, 3, 4同时消费一个RingBuffer,2, 3, 4并行,同时依赖1
disruptor.handleEventsWith(handler1).then(handler2, handler3, handler4);
//handler1,2,3,4同时消费一个RingBuffer,2依赖1,3依赖2,4依赖3
disruptor.handleEventsWith(handler1).then(handler2).then(handler3).then(handler4);
- 1
- 2
- 3
- 4
- 5
- 6
Event Resourcing
在Marin Flower介绍LMAX的价格的时候,http://martinfowler.com/articles/lmax.html
提出了一种思想:Event Resourcing
http://martinfowler.com/eaaDev/EventSourcing.html
下面以LMAX的架构为例,来讲解这种思想:
如上图所示,Receiver接收请求(这里的Receiver你可以理解为一个网络服务器),BLP处理请求,Publisher把处理结果交给下游。
在这里,BLP是纯粹在内存中操作,那它挂了之后,状态怎么恢复呢?这里有3个关键点:
(1)在BLP处理每一个Event之前,该Event先被Journaler日志化
(2)BLP本身是个状态机。即使挂了,可以重放所有日志,恢复状态。另外,为了提高恢复速度,BLP的状态可以定期做Snapshot。
(3)为了提高HA,可以准备多个BLP并行,1个挂了,切换到其它的。所以有一个Replicator组件,用于复制日志。
在这里,Receiver、BLP、Journaler、Replicator通过一个RingBuffer进行交互,如下图所示:
在这里有1个Producer,4个Consumer,前3个可以并行,最后一个BLP依赖前3个。
Un-marshaller在这里做一些Event的解析工作。
这种架构还有一个巨大优点就是:可测性。你可以把日志拷贝到测试环境,“重放“整个过程来测试BLP。
总结
通过上面的分析,我们会发现Disruptor并不是我们通常意义上的一个简单的RingBuffer。
基于它LMAX设计了一个新的架构,这种架构不仅速度够快,而且具有持久性、HA、可测性等诸多优点。
---------------------
本文来自 travi 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/chunlongyu/article/details/53313575?utm_source=copy
Disruptor-架构思维的转变的更多相关文章
- Linux架构思维导图
Linux架构思维导图 GUI(Graphical User Interface,图形用户界面) Linux学习路径 软件框架 Linux桌面介绍 FHS:文件系统目录标准 Linux需要特别注意的目 ...
- openstack 5大组件之间的关系和基本架构思维导图
云计算是一种按使用量付费的模式,这种模式提供可用的/便捷的/按需的网络访问,进入可配置的计算资源共享池(资源包括网络/服务器/存储/应用软件和服务),这些资源能够被快速提供,只需投入很少的管理工作或与 ...
- disruptor架构四 多生产者多消费者执行
1.首先介绍下那个时候使用RingBuffer,那个时候使用disruptor ringBuffer比较适合场景比较简单的业务,disruptor比较适合场景较为复杂的业务,很多复杂的结果必须使用di ...
- disruptor架构三 使用场景更加复杂的场景
先c1和c2并行消费生产者产生的数据,然后c3再消费该数据 我们来使用代码实现:我们可以使用Disruptor实例来实现,也可以不用产生Disruptor实例,直接调用RingBuffer的api来实 ...
- disruptor架构三 使用场景 使用WorkHandler和BatchEventProcessor辅助创建消费者
在helloWorld的实例中,我们创建Disruptor实例,然后调用getRingBuffer方法去获取RingBuffer,其实在很多时候,我们可以直接使用RingBuffer,以及其他的API ...
- disruptor架构二
小故事:Disruptor说的是生产者和消费者的故事. 有一个数组.生产者往里面扔芝麻.消费者从里面捡芝麻. 但是扔芝麻和捡芝麻也要考虑速度的问题. 1 消费者捡的比扔的快 那么消费者要停下来.生产者 ...
- disruptor架构一
Disruptor是一个高性能的异步处理框架,或者可以认为是最快的消息框架(轻量的JMS),也可以认为是一个观察者模式的实现,或者事件监听模式的实现. 在使用之前,首先说明disruptor主要功能加 ...
- django一般架构思维导图
本例已django项目名称为myblog,其下面有2个应用blog和comment介绍:
- web知识架构思维导图
图片双击放大还是很清晰的.原图大小5.1M
随机推荐
- Elasticsearch 分词器
无论是内置的分析器(analyzer),还是自定义的分析器(analyzer),都由三种构件块组成的:character filters , tokenizers , token filters. 内 ...
- C++STL模板库适配器之优先级队列
目录 适配器之优先级队列 一丶优先级队列简介(priority_queue) 二丶优先级队列代码演示 1.优先级队列代码以及使用简介 适配器之优先级队列 一丶优先级队列简介(priority_queu ...
- ASP.NET Core 2.1 : 十一. 如何在后台运行一个任务
在大部分程序中一般都会需要用到后台任务, 比如定时更新缓存或更新某些状态.(ASP.NET Core 系列目录) 一.应用场景 以调用微信公众号的Api为例, 经常会用到access_token,官方 ...
- MySQL数据库性能优化(享学课堂听课笔记)
1.场景: 2张表A表 200W条数据,关联表B表3W条数据,AB有主外键关系. 案例1. 35S 使用关联子查询,查询时间35S 案例2. 19S 使用连表查询 (Left join ,Inner ...
- X级联动
前端数据 @{ ViewBag.Title = "Index"; } <script src="~/Scripts/jquery-1.10.2.js"&g ...
- 反射:修改请求头HttpWebRequest/Webclient Header属性的date值-"此标头必须使用适当的属性进行修改"
场景:调用外部接口,接口要求Header信息里面包涵Date信息,且Date信息必须是格式化好的,(他们用的是Java),但是C#默认的是Date属性不能被修改, 所以就会出现下面的错误: 未处理的异 ...
- js之制作网页计时器
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- vue px转换为rem
前端开发中还原设计图的重要性毋庸置疑,目前来说应用最多的应该也还是使用rem.然而很多人依然还是处于刀耕火种的时代,要么自己去计算rem值,要么依靠编辑器安装插件转换. 而本文的目标就是通过一系列的配 ...
- sublime实现背景透明化
预览 老司机们就不要吐槽背景图了 实现方法 首先下载插件,直接打包下载zip即可 地址:https://github.com/vhanla/SublimeTextTrans 下载完成后解压到packa ...
- Access denied for user 'root'@'localhost' (using password:YES) Mysql5.7
解决方案: (1) 打开MySQL目录下的my.ini文件,在文件的最后添加一行“skip-grant-tables”,保存并关闭文件.(my.ini在C:\ProgramData\MySQL\MyS ...