disruptor笔记之四:事件消费知识点小结
欢迎访问我的GitHub
https://github.com/zq2599/blog_demos
内容:所有原创文章分类汇总及配套源码,涉及Java、Docker、Kubernetes、DevOPS等;
《disruptor笔记》系列链接
关于独立消费和共同消费
本篇是《disruptor笔记》的第四篇,前面章节写了不少代码,搞得读者和作者都辛苦,本篇稍微放松一下,熟悉一个重要概念:disruptor事件的消费模式,包括独立消费和共同消费两种;
举个例子,假设在电商场景中,每产生一个订单都要发邮件和短信通知买家,如果产生了十个订单,就有以下两种情况要考虑:
第一种:要发十封邮件和十条短信,此时,邮件系统和短信系统是各自独立的,他们各自消费这十个订单的事件,也就是说十个事件被消费二十次,所以邮件系统和短信系统各自独立消费,彼此没有关系,如下图,一个原点代表一个事件:

第二种:假设邮件系统处理能力差,为了提升处理能力,部署了两台邮件服务器,因此是这两台邮件服务器共同处理十个订单事件,合起来一共发送了十封邮件,如下图,一号邮件服务器和二号邮件服务器是共同消费,某个订单事件只会在一个邮件服务器被消费:

独立消费的核心知识点
- 使用的API是handleEventsWith
- 业务处理逻辑放入EventHandler的实现类中
- 内部实现用BatchEventProcessor类,一个消费者对应一个BatchEventProcessor实例,任务是获取事件再调用EventHandler的onEvent方法处理
- 一个消费者对应一个SequenceBarrier实例,用于等待可消费事件
- 一个消费者对应一个Sequence实例(BatchEventProcessor的成员变量),用于记录消费进度
- 每个BatchEventProcessor实例都会被放入集合(consumerRepository.consumerInfos)
- Disruptor的start方法中,会将BatchEventProcessor放入线程池执行,也就是说每个消费者都在独立线程中执行
共同消费的核心知识点
- 使用的API是handleEventsWithWorkerPool
- 业务处理逻辑放入WorkHandler的实现类中
- 内部实现用WorkerPool和WorkProcessor类合作完成的,WorkerPool实例只有一个,每个消费者对应一个WorkProcessor实例
- SequenceBarrier实例只有一个,用于等待可消费事件
- 每个消费者都有自己的Sequence实例,另外还有一个公共的Sequence实例(WorkerPool的成员变量),用于记录消费进度
- WorkerPool实例会包裹成WorkerPoolInfo实例再放入集合(consumerRepository.consumerInfos)
- Disruptor的start方法中,会调用WorkerPool.start方法,这里面会将每个WorkProcessor放入线程池执行,也就是说每个消费者都在独立线程中执行
精简的小结
- 上述核心知识点还是有点多,咱们用对比来精简一下,以下是精华中的精华,真不能再省了,请重点关注:
- 独立消费的每个消费者都有属于自己独有的SequenceBarrier实例,共同消费者是所有人共用同一个SequenceBarrier实例
- 独立消费的每个消费者都有属于自己独有的Sequence实例,对于共同消费者,虽然他们也有属于自己的Sequence实例,但这个Sequence实例的值是从一个公共Sequence实例(WorkerPool的成员变量workSequence)得来的
- 独立消费和共同消费都有自己的取数据再消费的代码,放在一起对比看就一目了然了,如下图,共同消费时,每个消费者的Sequence值其实来自公共Sequence实例,多线程之间用CAS竞争来抢占事件用于消费:

用图说话
- 最后放上自制图一张,希望有一图胜千言的效果吧:

- 至此,理论分析结束,接下来的文章会乘热打铁,基于上述知识点进行实战,编码实现三个场景:
- 100个订单,短信和邮件系统独立消费
- 100个订单,邮件系统的两个邮件服务器共同消费;
- 100个订单,短信系统独立消费,与此同时,两个邮件服务器共同消费;
你不孤单,欣宸原创一路相伴
欢迎关注公众号:程序员欣宸
微信搜索「程序员欣宸」,我是欣宸,期待与您一同畅游Java世界...
https://github.com/zq2599/blog_demos
disruptor笔记之四:事件消费知识点小结的更多相关文章
- disruptor笔记之五:事件消费实战
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- disruptor笔记之八:知识点补充(终篇)
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- disruptor笔记之二:Disruptor类分析
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- disruptor笔记之三:环形队列的基础操作(不用Disruptor类)
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- disruptor笔记之六:常见场景
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- disruptor笔记之七:等待策略
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- disruptor笔记之一:快速入门
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- Android笔记:触摸事件的分析与总结----TouchEvent处理机制
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://glblong.blog.51cto.com/3058613/1559320 ...
- 【SpringBoot MQ 系列】RabbitMq 核心知识点小结
[MQ 系列]RabbitMq 核心知识点小结 以下内容,部分取材于官方教程,部分来源网络博主的分享,如有兴趣了解更多详细的知识点,可以在本文最后的文章列表中获取原地址 RabbitMQ 是一个基于 ...
随机推荐
- Visual Studio调试器指南---多线程应用程序调试(一)
线程是操作系统向其授予处理器时间的指令序列. 在操作系统中运行的每个进程都包含至少一个线程. 包含多个线程的进程称为多线程.有多个处理器.多核处理器或超线程进程的计算机可以同时运行多个线程. 使用多个 ...
- ASP.NET Core教程:ASP.NET Core程序部署到Linux
一.前言 这篇文章我们将讲解如何将ASP.NET Core 程序部署到Linux.这里我们使用的是虚拟机里面安装的Centos7.这里的ASP.NET Core程序,以上篇文章中发布的框架依赖文件为例 ...
- WPF 知识点总结
一 · WPF中什么是样式? 首先明白WPF中样式属于资源中重要的一种. 同时样式也是属性值的集合,能被应用到一个合适的元素中,或者说能将一组属性应用到多个元素. WPF中样式可以设置任何依赖属性. ...
- vs2019 快捷键汇总
https://docs.microsoft.com/zh-cn/visualstudio/ide/default-keyboard-shortcuts-for-frequently-used-com ...
- CentOS8安装Mysql5.7
检查是否安装mysql [root@iZ2ze8crquorxf6c7l0eluZ ~]# rpm -qa |grep mysql [root@iZ2ze8crquorxf6c7l0eluZ ~]# ...
- MySQL常用权限操作
MySQL常用权限操作 ** ubuntu mysql 8.0.21修改root密码 ** 1.查看默认安装密码: sudo cat /etc/mysql/debian.cnf 2. 登录mysql ...
- input text 只能输入数字 js 正则表达式
$("#txt1").keyup(function () { $(this).val($(this).val().replace(/[^0-9.]/g, '')); }).bind ...
- SpringCloud分布式配置中心Config
统一管理所有配置. 1.微服务下的分布式配置中心 简介:讲解什么是配置中心及使用前后的好处 什么是配置中心: 一句话:统一管理配置, 快速切换各个环境的配置 相关产品: 百度的disconf 地址:h ...
- ARP协议工作原理实验
一.实验目的 验证"在向目的主机发送数据包时会先查询ARP高速缓存,如果ARP高速缓存中已保存了目的主机的MAC地址,不进行ARP查询,使用ARP高速缓存中的MAC地址:如果缓存中没有IP对 ...
- 解决Openstack Dashboard无法获取实例故障
在部署配置完openstack基础服务以及dashboard后.登录页面发现很多功能都不正常,无法获取实例,也无法获取镜像. 查看日志 [root@openstack-controller-dev ~ ...