当前位置: 首页 > news >正文

disruptor 核心概念 二

一、Disruptor图解

 

二、disruptor核心概念

1.RingBuffer到底是啥?
正如名字所说的一样,他是一个环(首尾相接的环
它用做在不同上下文(线程)间传递数据的buffer

RingBuffer拥有一个序号,这个序号指向数组中下一个可用的元素

Ringbugger:基于数组的缓存实现,也是创建sequencer与定义WaitStrtegy的入口

Disruptor:持有RingBuffer、消费者线程池Executor、消费者集合ConsumerRepository等引用

 

2.sequence
通过顺序递增的序号来编号,管理进行交换的数据(事件)

对数据(事件)的处理过程总是沿着序号逐个递增处理

一个Sequence用于跟踪标识某个特定的世界处理者(Ringbuffer/Producer/Consumer)的处理进度

Sequence可以看成是一个AtomicLong用于标识进度

还有另一个目的就是防止不同Sequence之间CPU缓存伪共享(Flase Sharing)的问题

 

3.Sequencer
Sequencer是Disruptor的核心 包含Sequence
此接口有两个实现类
SingleProducerSequencer
MultiProducerSequencer

主要实现生产者和消费者之间快速、正确的传递数据的并发算法

 

4.Sequence Barrier
用于保持对RingBuffer的Main Published Sequence(Producer)和Consumer之间的平衡关系;Sequence Barrier还定义了决定Consumer是否还有可处理的事件的逻辑

 

5.WaitStrategy
决定一个消费者将如何等待生产者将Event置入Disruptor!

主要的策略有:
BlockingWaitStrategy、SleepingWaitStrategy、YieldingWaitStrategy

BlockingWaitStrategy 是最低效的策略,但其对CPU的消耗最小并且在各种不同部署环境中能提供更加一致的性能表现

SleepingWaitStrategy 的性能表现跟BlockingWaitStrategy差不多,对CPU的消耗也类似,但其对生产者线程的影响最小,适合用于异步日志类似的场景

YieldingWaitStrategy 的性能是最好的,适合用于低延迟的系统。在要求极高性能且事件处理线数小于CPU逻辑核心数的场景中,推荐使用此策略;例如,CPU开启超线程的特性

 

6.Event
Event:从生产者到消费者过程中所处理的数据单元


7.EventProcessor
EventProcessor 主要事件循环,处理Disruptor中的Event,拥有消费者的Sequence

它有一个实现类是BatcheEventProcessor,包含了event loop 有效的实现,并且将回调到一个EventHandler接口的实现对象

 

8.EventHandler
EventHandler 由用户实现并且代表了Disruptor中的一个消费者的接口,也就是我们的消费者逻辑都需要写在这里


9.WorkProcessor
WorkProcessor 确保每个sequence只被一个processor消费,在同一个WorkPool中处理多个WorkProcessor不会消费同样的sequence!

 

转载于:https://www.cnblogs.com/gyli20170901/p/10244180.html

相关文章:

  • 线程池-线程池源码详解
  • Java总结 - String - 这篇请使劲喷我
  • 星舆科技:打造下一代定位技术 以高精度位置感知构筑AI+时代基础力量
  • Spring配置报错- 元素 'beans' 必须不含字符 [子级]
  • tomcat如何修改发布目录
  • bootstrap网站后台从设计到开发
  • 企业分布式微服务云SpringCloud SpringBoot mybatis (十二)断路器监控(Hystrix Dashboard)...
  • XML已死 ?
  • 如何查看Oracle官方文档
  • 开发常用的小软件
  • 香港股市大涨 创逾1个月新高
  • 程序员工作法
  • 三分钟了解实时流式大数据分析
  • 韩国企业入驻沈阳跨境电商产业园区
  • Windows 10 的 October 2018 更新开启自动推送
  • Java 网络编程(2):UDP 的使用
  • JAVA 学习IO流
  • Linux Process Manage
  • Next.js之基础概念(二)
  • Python_OOP
  • React Transition Group -- Transition 组件
  • React-生命周期杂记
  • 后端_MYSQL
  • 七牛云假注销小指南
  • 什么软件可以剪辑音乐?
  • 远离DoS攻击 Windows Server 2016发布DNS政策
  • ​​​​​​​sokit v1.3抓手机应用socket数据包: Socket是传输控制层协议,WebSocket是应用层协议。
  • ​Python 3 新特性:类型注解
  • $().each和$.each的区别
  • (day6) 319. 灯泡开关
  • (Demo分享)利用原生JavaScript-随机数-实现做一个烟花案例
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (zt)基于Facebook和Flash平台的应用架构解析
  • (附源码)apringboot计算机专业大学生就业指南 毕业设计061355
  • (附源码)ssm教材管理系统 毕业设计 011229
  • (十五)使用Nexus创建Maven私服
  • (四)【Jmeter】 JMeter的界面布局与组件概述
  • (原创)攻击方式学习之(4) - 拒绝服务(DOS/DDOS/DRDOS)
  • .Net 4.0并行库实用性演练
  • .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划
  • .NET 中的轻量级线程安全
  • .NET是什么
  • .pub是什么文件_Rust 模块和文件 - 「译」
  • ??javascript里的变量问题
  • @synthesize和@dynamic分别有什么作用?
  • [bzoj1006]: [HNOI2008]神奇的国度(最大势算法)
  • [BZOJ4010]菜肴制作
  • [C#]使用PaddleInference图片旋转四种角度检测
  • [E链表] lc83. 删除排序链表中的重复元素(单链表+模拟)
  • [Linux] LVS+Keepalived高可用集群部署
  • [Machine Learning][Part 8]神经网络的学习训练过程
  • [MySQL FAQ]系列 -- 账号密码包含反斜线时怎么办
  • [NOI 2016]循环之美
  • [one_demo_17]使用传统方式实现线程间通信的例子
  • [python]使用pyqt5搭建yolov8 竹签计数一次性筷子计数系统