disruptor_环形缓冲区– Disruptor背后的数据结构

2023-11-09

disruptor

环形缓冲区– Disruptor背后的数据结构

Disruptor是一个高性能的库,用于在线程之间传递消息,该库由LMAX Exchange公司于几年前开发和开源。 他们创建了此软件来处理其零售金融交易平台中的巨大流量(超过600万TPS)。 在2010年,他们惊讶于每个人通过在单个线程上执行所有业务逻辑,他们的系统能达到多快的速度。 尽管在解决方案中一个线程是一个重要概念,但Disruptor(这不是业务逻辑的一部分)可以在多线程环境中工作。 Disruptor基于环形缓冲区,这绝对不是一个新概念。

环形缓冲区

环形缓冲区有很多名称。 您可能听说过循环缓冲区,循环队列或循环缓冲区。 他们的意思都是一样的。 它基本上是一个线性数据结构,其中端点指向结构的开头。 很容易将其视为没有结尾的圆形数组。

可以想象,环形缓冲区通常用作队列。 它具有读写位置,分别由消费者和生产者使用。 当读或写索引到达基础数组的末尾时,它将被设置回0。此活动通常称为“环绕”,并且需要更多说明。

环绕

考虑以下情况:我们在数组的末尾具有写入索引,而在数组的开始处具有读取索引。 包裹起来安全吗?

好吧,很容易想象一个流媒体的例子,其中不再需要过时的数据,因为不断有更新的和更相关的数据出现,但是通常,我们确实关心尚未处理的数据。 如果是这种情况,则返回错误的布尔值或阻塞(如传统的有界队列一样)都可以。 如果这些解决方案都不满足我们的要求,我们可以实现一个环形缓冲区,该缓冲区可以调整自身大小(但只有在缓冲区满时才可以调整大小,而不仅仅是生产者到达数组末尾并且可以安全地环绕)。 调整大小将需要将所有元素移动到新分配的更大数组(如果将数组用作基础数据结构),这当然是昂贵的操作。

干扰器中的环形缓冲区

环形缓冲区在Disruptor中解决什么问题? 让我们看一下Disruptor的典型用例:

如您所见,我们将一条消息发送到多个使用者的输入队列(1-4)–因此,这是一个典型的多播(一种发布和订阅语义)。 然后我们遇到了障碍–我们希望所有消费者在继续下一步之前完成对消息的处理。 传递障碍后,消息将转到最后一个使用者的输入队列。 总而言之,我们有四个在相同数据上运行的独立(因此可能是并行的)任务(消费者1-4)和一个任务(从属消费者),这要求所有之前的任务都必须先完成才能开始工作。

在这种架构中,环形缓冲区在哪里? 好吧,环形缓冲区实际上就是这种架构。

假设一条消息是环形缓冲区中的单个项目。 环形缓冲区代表我们的实际队列(如果您愿意,可以代表多个下游队列)。 每个使用者都是一个遍历循环缓冲区的单独线程(如果愿意,也可以使用队列中的消息)。

屏障的实现方式是:从属消费者无法越过需要开始处理环形缓冲区项目(消息)之前需要完成的任何消费者。

单作家原则

即使使用Disruptor的最有效方法是拥有一个生产者和多个消费者,但多生产者场景也是可能的。 在这种情况下,同一游标上可能存在写争用。 Disruptor并没有使用传统的锁来解决此问题-因此它是无锁的( BlockingWaitStrategy除外)。 相反,它依赖于内存屏障和/或高性能CAS操作。

如果从属消费者需要以前的任何消费者产生的某些数据怎么办? 消费者是否还可以修改环形缓冲区中的商品并因此成为作家? 事实证明,这里使用了一个非常简单的规则–环形缓冲区中的每个项目都由一组字段组成,并且每个字段最多具有一个允许其写入的使用者。 这样可以防止使用者之间发生任何写争用。

摘要

还有许多其他因素可以使Disruptor快速运行,例如:

  • 以批处理方式使用消息
  • 使用环形缓冲区中的数据局部性,CPU缓存友好的优势
  • 在环形缓冲区中预先分配消息,以避免频繁垃圾回收项目(因此可以重复使用)

正如我在这里所解释的,即使环形缓冲区是一个相对简单的数据结构,它也可以轻松地用于实现更复杂的场景,而Disruptor只是一个示例。

翻译自: https://www.javacodegeeks.com/2017/12/ring-buffer-data-structure-behind-disruptor.html

disruptor

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

disruptor_环形缓冲区– Disruptor背后的数据结构 的相关文章

  • 使用鼻子获取设置中当前测试的名称

    我目前正在使用鼻子编写一些功能测试 我正在测试的库操作目录结构 为了获得可重现的结果 我存储了一个测试目录结构的模板 并在执行测试之前创建该模板的副本 我在测试中执行此操作 setup功能 这确保了我在测试开始时始终具有明确定义的状态 现在
  • Java 收集返回顶级项目的映射的嵌套流

    我有以下模型 class Item String name List
  • 在 pytube3 中获取 youtube 视频的标题?

    我正在尝试构建一个应用程序来使用 python 下载 YouTube 视频pytube3 但我无法检索视频的标题 这是我的代码 from pytube import YouTube yt YouTube link print yt titl
  • Spring Security OAuth2简单配置

    我有一个简单的项目 需要以下简单的配置 我有一个 密码 grant type 这意味着我可以提交用户名 密码 用户在登录表单中输入 并在成功时获得 access token 有了该 access token 我就可以请求 API 并获取用户
  • 如何配置 WebService 返回 ArrayList 而不是 Array?

    我有一个在 jax ws 上实现的 java Web 服务 此 Web 服务返回用户的通用列表 它运行得很好 Stateless name AdminToolSessionEJB RemoteBinding jndiBinding Admi
  • 如何在 python 中没有 csv.reader 迭代器的情况下解析单行 csv 字符串?

    我有一个 CSV 文件 需要重新排列和重新编码 我想跑 line line decode windows 1250 encode utf 8 在由 CSV 读取器解析和分割之前的每一行 或者我想自己迭代行 运行重新编码 并仅使用单行解析表单
  • Espresso 和 Proguard 的 Java.lang.NoClassDefFoundError

    我对 Espresso 不太有经验 但我终于成功地运行了它 我有一个应用程序需要通过 Proguard 缩小才能处于 56K 方法之下 该应用程序以 3 秒的动画开始 因此我需要等到该动画结束才能继续 这就是我尝试用该方法做的事情waitF
  • 逃离的正确方法是什么?使用 Oracle 12c MATCH_RECOGNIZE 时 JDBCPreparedStatement 中的字符?

    以下查询在 Oracle 12c 中是正确的 SELECT FROM dual MATCH RECOGNIZE MEASURES a dummy AS dummy PATTERN a DEFINE a AS 1 1 但它不能通过 JDBC
  • 尝试使用等于“是”或“否”的字符串变量重新启动 do-while 循环

    计算行程距离的非常简单的程序 一周前刚刚开始 我有这个循环用于解决真或假问题 但我希望它适用于简单的 是 或 否 我为此分配的字符串是答案 public class Main public static void main String a
  • 解析输入,除了 System.in.read() 之外不使用任何东西

    我很难找到具体的细节System in read 有效 也许有人可以帮助我 似乎扫描仪会更好 但我不允许使用它 我被分配了一个任务 我应该以 Boolean Operator Boolean 的形式读取控制台用户输入 例如T F 或 T T
  • Linux 上有关 getBounds() 和 setBounds() 的 bug_id=4806603 的解决方法?

    在 Linux 平台上 Frame getBounds 和 Frame setBounds 的工作方式不一致 这在 2003 年就已经有报道了 请参见此处 http bugs java com bugdatabase view bug do
  • 将图像添加到自定义 AlertDialog

    我制作了一个 AlertDialog 让用户可以从我显示的 4 个选项中选择一个 前 3 个让他们在单击号码时直接拨打号码 第 4 个显示不同的视图 现在看起来是这样的 由于第四个选项的目的是不同的任务 我想让它看起来不同 因为用户可能会感
  • 迭代 my_dict.keys() 并修改字典中的值是否会使迭代器失效?

    我的例子是这样的 for my key in my dict keys my dict my key mutate 上述代码的行为是否已定义 假设my dict是一本字典并且mutate是一个改变其对象的方法 我担心的是 改变字典中的值可能
  • Android - 9 补丁

    我正在尝试使用 9 块图片创建一个新的微调器背景 我尝试了很多方法来获得完美的图像 但都失败了 s Here is my 9 patch 当我用Draw 9 patch模拟时 内容看起来不错 但是带有箭头的部分没有显示 或者当它显示时 这部
  • Hibernate 和可序列化实体

    有谁知道是否有一个框架能够从实体类中剥离 Hibernate 集合以使它们可序列化 我查看了 BeanLib 但它似乎只进行实体的深层复制 而不允许我为实体类中的集合类型指定实现映射 BeanLib 目前不适用于 Hibernate 3 5
  • Android AutoCompleteTextView 带芯片

    我不确定我是否使用了正确的词语来描述此 UI 功能 但我已附上我希望在我的应用程序中实现的目标的快照 它由 Go SMS 使用 用户在编辑文本中键入联系人 在用户从完成下拉列表中选择联系人后 该联系人将被插入到编辑文本中 如附图所示 编辑文
  • 字典和数组作为类变量与实例变量

    这是赚取积分的简单方法 请解释以下内容 class C a b 0 c def init self self x def d self k v self x k v self a k v self b v self c append v d
  • Elastic Beanstalk 中的 enum34 问题

    我正在尝试在 Elastic Beanstalk 中设置 django 环境 当我尝试通过requirements txt 文件安装时 我遇到了python3 6 问题 File opt python run venv bin pip li
  • 嵌入式 Jetty - 以编程方式添加基于表单的身份验证

    有没有一种方法可以按如下方式以编程方式添加基于表单的身份验证 我用的是我自己的LdapLoginModule 最初我使用基本身份验证并且工作正常 但现在我想在登录页面上进行更多控制 例如显示徽标等 有没有好的样品 我正在使用嵌入式 jett
  • Scrapy Spider不存储状态(持久状态)

    您好 有一个基本的蜘蛛 可以运行以获取给定域上的所有链接 我想确保它保持其状态 以便它可以从离开的位置恢复 我已按照给定的网址进行操作http doc scrapy org en latest topics jobs html http d

随机推荐

  • 【机器学习】通俗易懂决策树(实战篇)python实现(为新患者找到合适的药物)

    决策树 我们将学习一种更流行的机器学习算法 决策树 我们将使用此算法从患者的历史数据以及他们对不同药物的反应大数据中 用训练过的决策树来构建分类模型预测未知患者的类别 或者说为新患者找到合适的药物 导入以下包 numpy as np pan
  • docker快速学习--容器的数据卷--04

    一 数据卷概念 数据卷是宿主机中的一个目录或文件 当容器目录和数据卷目录绑定后 对方的修改会立即同步 一个数据卷可以被多个容器同时挂载 一个容器也可以被挂载多个数据卷 二 数据卷作用 容器数据持久化 外部机器和容器间接通信 数据交互 容器之
  • python进阶--正则表达式(2)

    一 初识正则表达式 为了使计算机具有在文本中检索某种模式的能力 我们引入了正则表达式 正则表达式为高级的文本模式匹配 抽取或者文本形式的搜素和替换功能提供了基础 利用正则表达式能够匹配多个字符串 正则表达式的强大之处在于引入了特殊字符来定义
  • ajax工作原理 前后端交互流程

    一 前后端交互流程 1 服务器 提供某种服务器的机器 计算机 qq音乐 音频服务器 迅雷 文件服务器 qq邮箱 邮件服务器 爱奇艺 视频服务器 谷歌 web服务器 2 前端 访问 服务器的四种方式 1 直接在地址栏输入网址 网页会跳转 全局
  • Java Servlet 简单的登录代码

    需要的jar包 commons beanutils 1 8 0 jar druid 1 0 9 jar spring jdbc 5 0 0 RELEASE jar spring beans 5 0 0 RELEASE jar mysql c
  • C++(19)——智能指针shared_ptr

    shared ptr的概念 shared ptr实现共享式拥有 shared ownership 概念 多个智能指针可以指向相同对象 该对象和其相关资源会在 最后一个引用 reference 被销毁 时候释放 基本原理 智能指针是 几乎总是
  • MySQL数据库学习——SQL分类——DDL

    不能重复创建 可以用if not exists来避免这种情况 比如我要创建一个test的数据库 用if not exists系统就会创建 删除guzifenshisb这个数据库 使用数据库和查询数据库
  • Basic Level 1083 是否存在相等的差 (20分)

    题目 给定 N 张卡片 正面分别写上 1 2 N 然后全部翻面 洗牌 在背面分别写上 1 2 N 将每张牌的正反两面数字相减 大减小 得到 N 个非负差值 其中是否存在相等的差 输入格式 输入第一行给出一个正整数 N 2 N 10 000
  • protobuf

    https www jianshu com p 4b987ef826d3
  • 【前端部署】多个vue项目部署到Linux服务器

    前端部署 多个vue项目部署到Linux服务器 文章目录 前端部署 多个vue项目部署到Linux服务器 前言 一 修改vue项目中配置 1 修改vue config js 2 修改router文件下的index js 3 打包项目 二 修
  • 内存四区:代码区、全局区、栈区、堆区 代码分析

    阅读前请看一下 我是一个热衷于记录的人 每次写博客会反复研读 尽量不断提升博客质量 文章设置为仅粉丝可见 是因为写博客确实花了不少精力 希望互相进步谢谢 文章目录 阅读前请看一下 我是一个热衷于记录的人 每次写博客会反复研读 尽量不断提升博
  • command not found: tensorboard

    zsh command not found tensorboard 问题描述 我的深度学习框架采用的是pytorch 代码中使用tensorboardx来写日志的 之前使用tensorboad可以正常打开日志 但现在提示命令未找到 解决方案
  • 成功解决3dmax中,旋转时透视图可以看穿物体

    成功解决3dmax中 旋转时透视图可以看穿物体 目录 解决问题 解决思路 解决方法 解决问题 成功解决3damx中 旋转时透视图可以看穿物体 解决思路 有可能透视图出了毛病 解决方法 透视图看穿物体时 有可能透视图出了毛病 只需要将切换为正
  • 每日思维模型——管理4R模型

    什么是管理 人是管理的核心要素 通过管理 使人员达成共识 按照流程及规划工作 最终达成目标的系列活动 管人不是目的 发挥人组成的团队效应 高效完成任务才是目的 一 4R法则 4R法则可视为管理下属的总体原则 由四个 R 开头的四个英文单词组
  • 关于UnityHub更换位置后找不到编辑器以及登录界面白屏的问题

    若之前已经有该版本的unity3d 更换位置后显示找不到 可以找出它所在的位置 然后在UnityHub的安装选项中 点击添加已安装版本 该问题就能解决 若显示未登录 且登录界面白屏 可通过以下三个方法解决 关闭hub 在资源管理器中结束un
  • MybatisPlus从入门到精通-三更草堂补充版

    MybatisPlus从入门到精通 基础篇 1 概述 MybatisPlus是一款Mybatis增强工具 用于简化开发 提高效率 它在 MyBatis 的基础上只做增强不做改变 为简化开发 提高效率而生 官网 https mp baomid
  • 关于训练平台中Dockerfile与运行文件的编写

    何为Dockerfile 为了给特定的程序提供特定的运行环境 常用的解决办法是就构建镜像 而Dockerfile就是构建镜像的源代码 Docker程序根据这份源代码在镜像中安装 拷贝文件 设置环境变量 Dockerfile文件编写 下面列举
  • svn搭建

    Subversion SVN 是一个开源的版本控制系統 也就是说 Subversion 管理着随时间改变的数据 这些数据放置在一个中央资料档案库 repository 中 这个档案库很像一个普通的文件服务器 不过它会记住每一次文件的变动 这
  • 教你怎样娶比尔.盖茨的女儿

    无意中在网上看见这篇文章 仔细体会 能让人领会很多东西 一位优秀的商人杰克 有一天告诉他的儿子 杰克 我已经决定好了一个女孩子 我要你娶她 儿子 我自己要娶的新娘我自己会决定 杰克 但我说的这女孩可是比尔 盖茨的女儿喔 儿子 哇 那这样的话
  • disruptor_环形缓冲区– Disruptor背后的数据结构

    disruptor 环形缓冲区 Disruptor背后的数据结构 Disruptor是一个高性能的库 用于在线程之间传递消息 该库由LMAX Exchange公司于几年前开发和开源 他们创建了此软件来处理其零售金融交易平台中的巨大流量 超过