disruptor流程
这里先不提那些编译器方面的优化。只看一下基于无锁环形队列的生产者消费者模型的工作流程。上一个图先:
当中,buffer是一个数组,用来模拟环形队列。
slowest_reader记录最慢的reader读取数据的位置,主要用来防止写者写得太快而覆盖掉还未被读的数据。max_read_cursor是眼下可以读取的最远的数据的位置。这个位置应该是>=全部读者的位置的(初始化时为0,小于全部读者的位置,所以初始化时读者是不能读取数据的)。write_cursor是当前最快的写者的写入的位置。
那么假设再来一个写者请求写入怎么办?非常好办,把write_cursor++,然后写入到这个位置就可以。所以,disruptor是支持多个写者同一时候写入数据的(仅仅是公布时要有严格的先后顺序)。reader_cursor数组用来记录每一个读者的位置。
那么,如今写者要写入数据,该怎么做呢?前面已经说过了,write_cursor++,然后写入到这个位置。
例如以下图:
上图中,max_read_cursor也更新了,这个更新事实上是在写者公布他的写入后才有的。
如今。ring buffer中有数据了,读者能够读取数据了(标志是读者的cursor<=max_read_cursor)。读的时候就是把max_read_cursor作为最大的可读位置。
而这个最大可读位置可能比当前的某个读者的读取位置大了不止一个位置。
由于有可能写者写得比較快,全然能够写入非常多个位置而读者还在后面,那么这样的情况下读者就能够一下子取出非常多数据,而不是一个一个地去读取。
这也是disruptor的一个特点。
这里仅仅是讲了disruptor的基本流程。一些同步的细节并没有说。
读者在buffer中没有数据可读时该怎样等待这是一个和业务场景强相关的逻辑。能够轮询,也能够睡眠,这个后面再说。
转载于:https://www.cnblogs.com/mfrbuaa/p/5133251.html
disruptor流程相关推荐
- 你应该知道的高性能无锁队列Disruptor
1.何为队列 听到队列相信大家对其并不陌生,在我们现实生活中队列随处可见,去超市结账,你会看见大家都会一排排的站得好好的,等待结账,为什么要站得一排排的,你想象一下大家都没有素质,一窝蜂的上去结账,不 ...
- 一条数据的HBase之旅,简明HBase入门教程-Write全流程
如果将上篇内容理解为一个冗长的"铺垫",那么,从本文开始,剧情才开始正式展开.本文基于提供的样例数据,介绍了写数据的接口,RowKey定义,数据在客户端的组装,数据路由,打包分发, ...
- Disruptor源码解析 + 实战
本文转自微信公众号:[Amos博客] juc下的队列 1:从上图可以看出,juc下的队列基本采用加锁方式保证线程安全.通过不加锁的方式实现的队列都是无界的(无法保证队列的长度在限定的范围).而加锁的方 ...
- Disruptor之概览
作者: Zhang 原文: http://blog.reactor.top/2018/01/26/Disruptor之概览/ 概述 "多核危机"驱动了并发编程的复兴,然后并发编程和 ...
- Storm通信机制,Worker进程间通信,Worker进程间通信分析,Worker进程间技术(Netty、ZeroMQ),Worker 内部通信技术(Disruptor)(来自学习资料)
Storm通信机制 Worker间的通信经常需要通过网络跨节点进行,Storm使用ZeroMQ或Netty(0.9以后默认使用)作为进程间通信的消息框架. Worker进程内部通信:不同worker的 ...
- 高性能队列——Disruptor
背景 Disruptor是英国外汇交易公司LMAX开发的一个高性能队列,研发的初衷是解决内存队列的延迟问题(在性能测试中发现竟然与I/O操作处于同样的数量级).基于Disruptor开发的系统单线程能 ...
- Disruptor并发框架--学习笔记
Disruptor并发框架简介 Martin Fowler在自己网站上写了一篇LMAX架构的文章,在文章中他介绍了LMAX是一种新型零售金融交易平台,它能够以很低的延迟产生大量交易.这个系统是建立在J ...
- 每秒钟承载600万订单级别的无锁并行计算框架 Disruptor学习
1.来源 Disruptor是英国外汇交易公司LMAX开发的一个高性能队列,研发的初衷是解决内部的内存队列的延迟问题,而不是分布式队列.基于Disruptor开发的系统单线程能支撑每秒600万订单,2 ...
- disruptor 介绍
一.背景 1.来源 Disruptor是英国外汇交易公司LMAX开发的一个高性能队列,研发的初衷是解决内部的内存队列的延迟问题,而不是分布式队列.基于Disruptor开发的系统单线程能支撑每秒600 ...
- disruptor模拟高速处理大规模订单类业务场景
什么是Disruptor? Disruptor是一个开源的JAVA框架,它被设计用于在生产者-消费者(producer-consumer problem,简称PCP)问题上获得尽量高的吞吐量(TPS) ...
最新文章
- 小心陷入MySQL索引的坑
- Java知识整理——ServletJSP
- Netty异步非阻塞事件驱动及原理详解
- boost学习之BOOST_PP_SEQ_FOR_EACH_R
- 比较两个文本中数据不同的行
- 港府多措施推广使用电动车 放宽条件吸引车主换车
- 50个精心收集的惊人的jquery绚丽插件--功能全覆盖
- 二十二、K8s集群设置4-网络策略与校验和
- logback 打印日志参考,包含异步打印日志及历史日志压缩
- ICH E2B | ICSR 电子传输网关对接解决方案
- 欧若科技通过 OpenKG 开放 Nebula Graph 图数据库
- c语言单片机秒表程序,单片机秒表程序
- 【Idea】换行快捷键
- 4G工业路由器DTU的扩展功能
- MailRaider Pro for Mac(Outlook邮件格式转换工具) v3.5.0永久激活
- 用了postman,接口测试不用愁了
- Nginx安装及常用优化和配置
- 关于产品的一些思考——搜狐之搜狗输入法(手机版)
- android studio 调试问题解决记录
- Riak - 背景篇(3)
热门文章
- Tomcat—HTTPS之生成密钥库文件与配置Tomcat服务器
- Windows中ElasticSearch的备份和还原
- CHROME 拖动安装插件报错CRX_HEADER_INVALID的解决办法
- linux 扫描媒体库,如何扫描出Android系统媒体库中视频文件
- 小学计算机课教案多变的刷子,信息技术《多变的刷子工具》教学设计.doc
- 为什么计算机报名无法选择福建,2020年9月福建计算机考试如何报名
- mongodb查询不等于某个字段_Oracle单表查询多字段,不使用*
- 单端口和双端口的优势_哪种适合您,三种常见组网方式比较
- 药店计算机无法运行整改报告,药店整改报告模板网络版(电子版)
- python psutil模块怎么在线下载_python之psutil模块