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
随机推荐
- SpringBoot入门教程(八)配置logback日志
Logback是由log4j创始人设计的又一个开源日志组件.logback当前分成三个模块:logback-core,logback- classic和logback-access.logback-c ...
- java~spring-ioc的使用
spring-ioc的使用 IOC容器在很多框架里都在使用,而在spring里它被应用的最大广泛,在框架层面 上,很多功能都使用了ioc技术,下面我们看一下ioc的使用方法. 把服务注册到ioc容器 ...
- 前端笔记之JavaScript(二)关于运算符&初识条件判断语句
运算符 数学运算符的正统,number和number的数学运算,结果是number.出于面试的考虑,有一些奇奇怪怪的数学运算: 数学运算中:只有纯字符串.布尔值.null能够进行隐式转换. //隐式转 ...
- Chapter 5 Blood Type——10
"What?" “什么?” "Your boyfriend seems to think I'm being unpleasant to you — he's debat ...
- ELK-Logstash采集日志和输送日志流程测试
讲解Logstash采集日志和输送日志流程测试,包括input,filter和output元素的测试 配置一:从elasticsearch日志文件读取日志信息,输送到控制台 $ cd /home/es ...
- 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes
前言 在之前的一篇文章中,我们介绍了 如何将一个本地的 Java 应用程序直接部署到阿里云 ECS ,有不少读者反馈,如果目前已经在使用阿里云容器服务 Kubernetes 了,那该如何配合这个插件部 ...
- [二] JavaIO之File详解 以及FileSystem WinNTFileSystem简介
File类 文件和目录路径名的抽象表示形式. 我们知道,对于不同的操作系统,文件路径的描述是不同的 比如 windows平台:用\ linux平台:用/ File是Java为了这一概念提供的抽象描 ...
- 利用Sklearn实现加州房产价格预测,学习运用机器学习的整个流程(包含很多细节注解)
Chapter1_housing_price_predict .caret, .dropup > .btn > .caret { border-top-color: #000 !impor ...
- MySQL/MariaDB系列文章目录
以下是本系列文章的大纲,此页博文完全原创,花费了作者本人的极大心血,如转载,请务必标明原文链接. 如果觉得文章不错,还请帮忙点下"推荐",各位的支持,能激发和鼓励我更大的写作热情. ...
- 封装自定义服务$http
var httpService = angular.module('httpService', []); httpService.factory("$httpService",fu ...