`
bruce008
  • 浏览: 170238 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Disruptor 模式简单理解

 
阅读更多

Disruptor   主要用作进程间高效通信的一种模式, 它里面所有的实现都是围绕着怎样做可以high performance。 它的核心是 RingBuffer,其实就是一个事先分配好的数组。  这样做有几个好处:

 

   1,  GC友好, 事先分配好内存就避免了linkedqueue 那样不断的分配释放内存。 使用每一个单元的话步骤是先claim; 拿到claim 到得 单元, 使用copy的方式 将数据拷贝到那个单元; 然后发表那个单元。

 

   2,  这个Buffer 里面的单元都有一个sequence,  我的理解就是版本号。   64位long 是从-1 初始值开始永远增长下去。  为了这个sequence,  Disruptor 专门定义了一个 Sequence 类, 在它里面:

      private volatile long p1 = 7L, p2 = 7L, p3 = 7L, p4 = 7L, p5 = 7L, p6 = 7L, p7 = 7L,

                          value = Sequencer.INITIAL_CURSOR_VALUE,

                          q1 = 7L, q2 = 7L, q3 = 7L, q4 = 7L, q5 = 7L, q6 = 7L, q7 = 7L;

 

   其实真正有用的就是那个 value 域。  但是为什么value 的前后各自放了 7个 long 型的域呢。  在它的设计人员里面的博客里面有说明, 按照java 的内存模型一个对象的域会按它们的类型而不是定义顺序放在一起。 通常每64个byte 的内存内容叫做一个cache line, 机器得内存, L1, L2, L3 cache 之间内容交换都是按照cache line 级别来做的。 这样value 两边padding 了就避免了一个sequence 对象跟别的对象在cache 中False Sharing。  跑了些Disruptor 里面的unit test ,发现确实有很大差异。

 

    3,  那边如何做到 producer/ consumer 协调工作呢 在 RingBuffer的超类中定义了  claimStrategy/waitStrategy.  Producer 使用的是claimStrategy, 当然consumer 使用的就是 waitStrategy 了。 一个最基本的原则就是 producer 的sequence  - bufferSize  不能小于所有的 consumer 的sequence。也就是说没有wrapping。 如果小于也就是producer 要等待, 否则就是有空间可以producer。  在具体怎么等待的Strategy 上, 它给出了3种方式: Busy Spin  (也就是spin 循环) , Yield (Thread.yield) ,  Block.  

 

 

    结合着Java 的内存, 线程模型 JSR 133 来看感觉不管是对 133 还是这个模式都有帮助。 现在盗用一张 Disruptor

 1.0 的关于RingBuffer的类图如下:

    Ring Buffer

 

 

 

  • 大小: 54.9 KB
分享到:
评论

相关推荐

    Disruptor专题简单案例资料

    Disruptor专题简单案例资料 https://phoenix.blog.csdn.net/article/details/131264151

    disruptor案例加简单说明

    简单讲解disruptor并附上demo

    Java工具:高性能并发工具Disruptor简单使用

    Java工具:高性能并发工具Disruptor简单使用

    Disruptor3.x Disruptor使用方式

    Disruptor3.x Disruptor使用方式 EventHandler[] eventHandlers=new DisruptorEventHandler[]{new DisruptorEventHandler()}; DisruptorPublisher dp=new DisruptorPublisher(1024, eventHandlers); dp.start(); ...

    Disruptor demo

    Disruptor简单使用。完成多线程间并行、等待、先后执行等功能。

    Disruptor 入门 - v1.0

    可以拿 JDK 的 BlockingQueue 做一个简单对比,以便更好地认识 Disruptor 是什么。 我们知道 BlockingQueue 是一个 FIFO 队列,生产者(Producer)往队列里发布(publish)一项事件(或称之为“消息”也可以)时,消费者...

    disruptor-3.3.8.jar

    Error: java.lang.NoSuchMethodError: com.lmax.disruptor.dsl.Disruptor.<init>(Lcom/lmax/disruptor/EventFactory;ILjava/util/concurrent/ThreadFactory;Lcom/lmax/disruptor/dsl/ProducerType;Lcom/lmax/...

    Disruptor示例

    Martin Fowler在自己网站上写了一篇LMAX架构的文章,在文章中他...Disruptor是一个高性能的异步处理框架,或者可以认为是最快的消息框架(轻量的JMS),也可以认为是一个观察者模式的实现,或者事件监听模式的实现。

    disruptor框架案例.rar

    Disruptor它是一个开源的并发框架能够在无锁的情况下实现...同时,Disruptor是一个高性能的异步处理框架,或者可以认为是最快的消息框架(轻量的JMS),也可以认为是一个观察者模式的实现,或者事件监听模式的实现。

    disruptor-3.4.4.jar disruptor 3.4.4 jar 官方github下载

    disruptor-3.4.4.jar 官方github下载 亲测可用,大家赶紧下载吧 后续再补充其他常用jar(但不好下载的)

    disruptor-3.3.0-API文档-中文版.zip

    赠送jar包:disruptor-3.3.0.jar; 赠送原API文档:disruptor-3.3.0-javadoc.jar; 赠送源代码:disruptor-3.3.0-sources.jar; 赠送Maven依赖信息文件:disruptor-3.3.0.pom; 包含翻译后的API文档:disruptor-...

    disruptor-3.3.0-API文档-中英对照版.zip

    赠送jar包:disruptor-3.3.0.jar; 赠送原API文档:disruptor-3.3.0-javadoc.jar; 赠送源代码:disruptor-3.3.0-sources.jar; 赠送Maven依赖信息文件:disruptor-3.3.0.pom; 包含翻译后的API文档:disruptor-...

    Disruptor资料合集

    Disruptor是一个开源的Java框架,它被设计用于在生产者—消费者(producer-consumer problem,简称PCP)问题上获得尽量高的吞吐量(TPS)和尽量低的延迟。Disruptor是LMAX在线交易平台的关键组成部分,LMAX平台使用...

    disruptor-3.2.0.jar

    disruptor-3.2.0.jar包下载disruptor-3.2.0.jar包下载disruptor-3.2.0.jar包下载

    并发框架Disruptor

    Java并发框架Disruptor,里面采取环形缓存结构,速度更快,适用于生产者消费者模式

    disruptor-3.3.7-API文档-中英对照版.zip

    赠送jar包:disruptor-3.3.7.jar 赠送原API文档:disruptor-3.3.7-javadoc.jar 赠送源代码:disruptor-3.3.7-sources.jar 包含翻译后的API文档:disruptor-3.3.7-javadoc-API文档-中文(简体)-英语-对照版.zip ...

    spring集成disruptor

    网上关于Disruptor的例子大部份是旧版本的, 其中集成spring的更少, 只好自已写个新版本简单的demo了。 该demo利用spring的定时器往Disruptor添加数据, 希望该demo能帮助到大家。

    disruptor jar包+Demo+Api

    disruptor 的jar包和api 自带了一个简单的例子。带注释 不是官方的例子。 不过是转别人的。 看了之后很容易明白。

    LMAX-Disruptor框架jar包

    Disruptor框架是由LMAX公司开发的一款高效的无锁内存队列。使用无锁的方式实现了一个环形队列。据官方描述,其性能要比BlockingQueue至少高一个数量级。根据GitHub上的最新版本源码打出的包,希望对大家有帮助。

    disruptor 多个消费者

    disruptor 多个消费者 但是只消费一次 有时候会有这样的需求

Global site tag (gtag.js) - Google Analytics