幼儿饰品瑜伽美体用品微软
投稿投诉
微软创意
爱情通信
用品婚姻
爱好看病
美体软件
影音星座
瑜伽周边
星座办公
饰品塑形
搞笑减肥
幼儿两性
智家潮品

高性能线程间消息传递库Disruptor概述

  Disruptor是一个高性能的线程间消息传递库。它源于LMAX对并发性、性能和非阻塞算法的研究,如今构成了其Exchange基础架构的核心部分。
  理解Disruptor是什么的最好方法是将它与目前已经的很好理解和非常相似的东西进行比较,例如与Java的BlockingQueue进行对比。与队列一样,Disruptor的目的是在同一进程内的线程之间传递数据(例如消息或事件)。但是Disruptor相比传统JDK中的队列提供了一些关键功能,它们是:Disruptor中的同一个消息会向所有消费者都发送即多播能力。
  为事件(events)预先分配内存,避免频繁垃圾回收与内存分配开销。
  可选择无锁(lockfree),基于CAS操作让多个生产者不会竞争同一个元素,实现无锁操作元素。
  使用两阶段协议,让多个线程可同时修改不同元素,需要注意的是消费元素时候只能读取到已经提交的元素。
  缓存行填充,避免伪共享。
  多播能力是Java中队列和Disruptor之间最大的行为差异。当有多个消费者在同一个Disruptor上监听事件时候,所有事件都会发布给所有消费者,而Java队列中的每个事件只会发送给某一个消费者。Disruptor的行为旨在用于需要对同一数据进行独立的多个并行操作的情况。
  Disruptor的目标之一是在低延迟环境中使用,在低延迟系统中,必须减少或移除运行时内存分配的开销;在基于Java的系统中,目的是减少由于垃圾收集导致的系统停顿;为了支持这一点,用户可以预先分配Disruptor中事件所需的存储空间(也就是声明RingBuffer的大小)。在构造RingBuffer期间,EventFactory由用户提供,并将在Disruptor的RingBuffer中每个事件元素创建时候被调用。将新数据发布到Disruptor时,API将允许用户获取构造的对象,以便他们可以调用方法或更新该存储对象上的字段,Disruptor保证这些操作只要正确实现就是并发安全的。
  低延迟期望推动的另一个关键实现细节是使用无锁算法来实现Disruptor;所有内存可见性和正确性保证都是使用内存屏障(体现为volatile)或CAS操作实现的;在Disruptor的实现中只有一个情况需要实际锁定,这就是当使用BlockingWaitStrategy策略时候,这仅仅是为了使用条件变量,以便在等待新事件到达时前parked消费线程。许多低延迟系统将使用忙等待busywait来避免使用条件可能引起的抖动,但是大量在系统繁忙等待的操作可能导致性能显着下降,尤其是在CPU资源严重受限的情况下。
  在JDK的BlockingQueue中当我们需要添加或者取出元素时候是需要加独占锁的,通过锁来保证多线程对底层共享的数据结构进行保护,使用锁导致同时只有一个线程可以向队列添加元素或者删除元素。Disruptor则使用两阶段协议,让多个线程可同时修改不同元素,需要注意的是消费元素时候只能读取到已经提交的元素;在Disruptor中某个线程要访问RingBuffer中某个序列号下对应的元素时候要先通过CAS操作获取对应元素的所有权(第一阶段),然后通过序列号获取到对应的元素对象并对其中的属性进行修改,最后在发布元素(第二阶段),只有发布后的元素才可以被消费者读取;当多个线程写入元素时候多个线程都会先执行CAS操作获取到Ringbuffer中的某一个元素的所有权,然后可以并发的对自己的元素进行修改,但是需要注意的是只有序列号小的发布后,后面的才可以发布。可知使用CAS相比使用锁大大减少了开销,提高了并发度。
  提高并发系统性能的最佳方法之一是遵循SingleWriter原则,这适用于Disruptor。如果处于只有一个线程产生事件进入Disruptor的情况下,那么可以利用它来获得额外的性能,这是因为在单生产者下,连CAS操作都可以避免,直接使用普通的long型变量来标识生产者的序列号。
  计算机系统中为了解决主内存与CPU运行速度的差距,在CPU与主内存之间添加了一级或者多级高速缓冲存储器(Cache),这个Cache一般是集成到CPU内部的,所以也叫CPUCache,如下图是两级cache结构:
  Cache内部是按行存储的,其中每一行称为一个Cache行,Cache行是Cache与主内存进行数据交换的单位,Cache行的大小一般为2的幂次数字节
  当CPU访问某一个变量时候,首先会去看CPUCache内是否有该变量,如果有则直接从中获取,否者就去主内存里面获取该变量,然后把该变量所在内存区域的一个Cache行大小的内存拷贝到Cache(Cache行是Cache与主内存进行数据交换的单位)。由于存放到Cache行的的是内存块而不是单个变量,所以可能会把多个变量存放到了一个cache行。当多个线程同时修改一个缓存行里面的多个变量时候,由于同时只能有一个线程操作缓存行,所以相比每个变量放到一个缓存行性能会有所下降,这就是伪共享。
  如上图变量x,y同时被放到了CPU的一级和二级缓存,当线程1使用CPU1对变量x进行更新时候,首先会修改cpu1的一级缓存变量x所在缓存行,这时候缓存一致性协议会导致cpu2中变量x对应的缓存行失效,那么线程2写入变量x的时候就只能去二级缓存去查找,这就破坏了一级缓存,而一级缓存比二级缓存更快,这里也说明了多个线程不可能同时去修改自己所使用的cpu中缓存行中相同缓存行里面的变量。更坏的情况下如果cpu只有一级缓存,那么会导致频繁的直接访问主内存(更多伪共享相关可以参考《Java并发编程之美》一书)。
  Disruptor中的环形缓存(RingBuffer)底层是一个地址连续的数组,则数组内相邻的元素很容易会被放入到同一个Cache行里面从而导致伪共享的出现,Disruptor通过缓存行填充,让数组中的每个元素独占一个缓存行从而解决了伪共享问题的出现。另外为了避免环形缓存(RingBuffer)中序列号(定位元素的游标)与其他元素共享缓存行,对其进行了缓存行填充,以提高访问序列号时候缓存的命中率。
  Disruptor中的DDD(DomainDrivenDesign)域对象RingBuffer:环形缓冲区,通常被认为是Disruptor的核心,但是从3。0版本开始,RingBuffer仅负责存储和更新Disruptor中的数据(事件)。Sequence:Disruptor使用Sequences作为识别特定组件所在位置的方法。每个消费者(EventProcessor)都像Disruptor本身一样维护一个Sequence。大多数并发代码依赖于这些Sequence值的移动,因此Sequence支持AtomicLong的许多当前功能。事实上,3版本与2之间唯一真正的区别是防止了Sequence和其他变量之间出现伪共享。Sequencer:Sequencer是Disruptor的真正核心。该接口的2个实现(单生产者,多生产者)实现了所有并发算法,用于在生产者和消费者之间快速、正确地传递数据。SequenceBarrier:序列屏障(SequenceBarrier)由Sequencer产生,并包含对Sequencer中主要发布者的序列Sequence和任何依赖的消费者的序列Sequence的引用。它包含了确定是否有任何可供消费者处理的事件的逻辑。WaitStrategy:等待策略,确定消费者如何等待生产者将事件放入Disruptor。Event:从生产者传递给消费者的数据单位。事件没有特定的代码表示,因为它完全由用户定义。EventProcessor:用于处理来自Disruptor的事件的主事件循环,并拥有消费者序列的所有权。其有一个名为BatchEventProcessor的实现,它包含事件循环的有效实现,并将回调使用者提供的EventHandler接口实现(在线程池内运行BatchEventProcessor的run方法)。EventHandler:由用户实现并代表Disruptor的消费者的接口。Producer:调用Disruptor以将事件放入队列的用户代码。这个概念在代码中也没有具体表示。
  上面我们介绍了为了Disruptor中的核心概念,下面我们将这些元素组合在一起,如下图是LMAX在其高性能核心服务中使用Disruptor的示例:
  如上图示例中有三个消费者,即日志记录JournalConsumer(将输入数据写入持久性日志文件),复制ReplicationConsumer(将输入数据发送到另一台机器以确保存在数据的远程副本)和业务逻辑ApplicationConsumer(真正的处理工作),其中JournalConsumer和ReplicationConsumer是可以并行执行的。
  Producer向Disruptor的RingBuffer中写入事件,消费者JournalConsumer和ReplicationConsumer(EventHandler)使用多播方式同时消费RingBuffer中的每一个元素,两者都有各自的SequenceBarrier用来控制当前可用消费RingBuffer中的哪一个事件,并且当不存在可用事件时候如何处理。消费者ApplicationConsumer则是等JournalConsumer和ReplicationConsumer对同一个元素处理完毕后,在对该元素进行处理,这个可以使用下面这个简化图来概括:
  每个消费者持有自己的当前消费序号,由于是环形buffer,所以生产者写入事件时候要看序号最小的消费者序号,以避免覆盖还没有被消费的事件,另外Consumer3消费事件时候只能消费已经被Consumer1,Consumer2都处理过的事件。
  每个EventHandler被包裹到对应的BatchEventProcessor中,BatchEventProcessor是一个事件处理循环,类似NIOevenloop,每个BatchEventProcessor被分到线程池里面一个固定线程来执行。BatchEventProcessor发现可用元素后,就调用EventHandler发射出元素。如上图Consumer1,Consumer2,Consumer3共享同一个Ringbuffer。
  另外如上图Consumer1,Consumer2(EventHandler)分别被自己的BatchEventProcessor包裹,但是其共享同一个SequenceBarrier,Consumer1,Consumer2读取元素时候要调用SequenceBarrier的waitfor来判断是否有可以读取的元素;Consumer3被自己的BatchEventProcessor包裹,其有自己的SequenceBarrier,并且持有其依赖的前面的所有消费者的引用(Consumer1,Consumer2的引用),Consumer3消费元素时候要看其依赖的所有消费者,看其是否都消费了某一个元素,如果是其才可以消费该元素。

过了50岁以后眉毛变长,意味着长寿吗?一文为你解释清楚休息天没事干,看一帮老大爷下棋,听到一个很有意思的说法。老李头,你这眉毛怎么越来越长了?该修修啦!吃你一个小兵!你懂什么,这是寿眉,是长寿的象征。嘿,这是什么……一项疯狂的新研究声称,地球可能被一个巨大的磁隧道包围着几十年来,一直困扰着天文学家的天空中的神秘结构可能终于有了一个解释。这可是相当了不起的事情。上图:左:隧道的样子;右:天空的样子。北银极支(northpolarsp……这一年有20个真相,值得我们好好深思秋风袭来,年过大半。回望昨日,才知年已老去,韶华易逝。想起2021年,还以为时间仍旧停留在三四月的时候。殊不知,2021年的电量,已经不足百分之二十五了。在这段时光……11月SUV销量排行自主9车霸榜围攻合资,极氪001哪吒V成临近年底,对于各行各业而言,都希望在有限的时间内放出最大的促销力度吸引消费,冲击既定的销量任务,汽车行业也不例外。从车企在双11购物节中的参与度不难看出,促销政策和力度是……两支LPL战队接连被爆,德杯A组发生了什么?18日,2021LPL德玛西亚杯A组小组赛正式开打。TES、JDG、WE、BLG四支LPL队伍和主播队伍HYA披挂上阵,为观众们带来了精彩对决和视觉享受。在17号的第一个……下周重点关注极具爆发潜力的四个板块一、数字货币数字人民币碳中和试点扩容,在冬奥安保线外,数字人民币落地场景也已遍地开花,上周就给大家提示有爆发迹象,隔日就爆发,休息了两日,周五又来了,不过被市场太差带了下……春节家宴,餐桌上必备的5道硬菜,提前学会,过年待客特有面儿大家好,我是大磊。2022农历虎年马上就要到了,家家户户也都开始忙活着过春节了。无论是大三十的年夜饭,还是招待客人的餐桌上,硬菜都是必不可少的。硬菜是一个饭局的担当,对于……荐号格局越大的人,越会花费时间在优质公号上《菜根谭》中有句话说:处世让一步为高,退步即为进步的张本。人生路上,我们会遇到太多的事情,几乎无法事事顺心,但如何处理却一步一步影响着人生的走向。格局小的人,总是会……1060畅玩?战神PC端推荐配置公布说到playstation就一定会提到战神(godofwar)。作为PS平台热度最高的动作冒险游戏之一,战神最新一作发售一年就斩获了1000万销售量。发售当月便成为twi……50岁的她,宛如20岁少女,如何做到的?分享保养方法给你,学导语:时间是无情的,无比残酷但又无比公平,在每个人身上都会留下痕迹,但也有一些人。时间只是将他们打磨得更加出色,样貌却依然如初。50岁的万绮雯,美貌依然如同我们在电视上初……可同时快充两台设备的精致小巧充电器南卡C220W迷你PD充电前言:自从水果机打着环保的名义,购买新手机的同时必须自费购买PD充电器,这就让很多手机消费者需要花更多的钱来购买充电器,一个原装20W的PD充电器高达200元左右,否则只……2022心动好物推荐,售价仅为39。9的贱驴鼠标,非常不错这个品牌是我某一天在逛朋友圈时发现的,不得不承认这个喜感的名字瞬间引起了我的兴趣,同样的还有那只黑黄配色格外骚气的贱驴鼠标和一组很吸引人的宣传图片。当我询问了这款驴鼠标价格的时……
Pico4VR有望9月亮相或加入运动环配件实现动作捕捉功能提到任天堂的Switch健身类游戏,大家应该第一时间都能想到健身环大冒险这款游戏,只要搭配健身环的相关配件,就能在游戏中做运动健身的动作来实现燃脂瘦身的目的,现在一些VR厂商也……受益于健康观念提升智能手环行业发展潜力巨大受益于健康观念提升智能手环行业发展潜力巨大智能手环是一种穿戴式智能设备,支持活动、锻炼、睡眠等模式,拥有智能闹钟、健康提醒、睡眠追踪、运动监测等功能。消费者可以使用智能手……大事件!腾讯QQ你教我唱上线好友对战模式,最多四人同台自从腾讯QQ在超级QQ秀中的音乐小游戏《你教我唱》进入测试以来,就深受年轻QQ用户的喜爱。因为这里不仅有简单好玩的音游模式,更有海量的时尚曲库,可谓是首首经典。而就在最近的一次……当一个人越来越安静,越来越沉默正如鲁迅先生所说:当我保持沉默的时候,我觉得很充实;当我开口说话,就感到了空虚。虽然开口说话是人的本能,但是保持沉默却是一种修养。真正的智者知道少说,多听,适当保持沉默。……球球大作战举办了一场元宇宙蹦迪,巨人网络试敲元宇宙之门巨人网络旗下手游《球球大作战》近期在Fanbook平台办了一场元宇宙蹦迪,被业内看成是一次对元宇宙应用场景的探索。知名游戏媒体游戏葡萄参与了这场线上音乐节活动,称被大量玩……为什么这么多人愿意发微头条如鱼饮水,冷暖自知,更何况当下由于各种各样的原因,压力、危机感、内卷陡增。无处释放的情绪,无处安放的内心,这不吐不快的冲动,由于网络信息的共享,让许多人找到了属于自己的一隅天地……PlayStation5终于获得了1440p支持,显示器玩家PlayStation5现在支持1440p,至少对于可以访问其测试版软件的游戏玩家来说。虽然控制台从一开始就支持1080p和4K输出,但1440p支持仍然是使用显示器而不是电视……挂面竟然有这么多花样吃法,省事方便简单易做,味道好极了挂面竟然有这么多花样吃法,省事方便简单易做,味道好极了。第一种:挂面方便面,挂面下入开水锅煮断生捞出过凉水,控干多余水分,平铺在笊篱上,形成一个圆形,下入六成热的油锅中炸……IDC2022年第二季全球平板电脑出货量持平增长根据国际数据资讯(IDC)全球个人运算设备关注报告的初步研究结果显示,2022年第二季(2Q22)全球平板电脑出货量达到4,050万台,年增长0。15。使本季出货量优于预期的原……小编带大家研究30米怎么起号今日小编给大家带来的它是一款三职业传奇手游散人服《大侠传奇》。这一个服近期特别火,最先这是个攻击速度不封顶新版本,武器装备、荣誉称号、时装搭配这些,大部分全凭肝。现在就带大家了……刺痛SOLO赛迎来高潮,直面头号大敌,六尾的守约让他感受到恐消息灵通的小伙伴肯定都知道近期刺痛举办的SOLO赛事,从8月15号到8月31号,长达两周的时间,刺痛每天都要面对来自全网发育路的挑战。现在赛事已经进行了十多天,刺痛不负当初KP……它是全球旅游差评最多的国家,好色成瘾,却被评为世界最佳旅行地走过最长的路,就是这个国家的套路!有人说,旅行是一件天时地利人和的事情。有时做了长长的攻略,避开了天不应时,地不假利,却输在了人不相和,于是在各大平台愤愤留下……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网