`
bruce008
  • 浏览: 175258 次
  • 性别: 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 concurency pattern in c++.zip

    Disruptor模式的核心思想是消除线程间的共享数据,通过一个环形缓冲区(Ring Buffer)来传递消息,从而避免了锁和条件变量带来的性能开销。在传统的并发编程中,线程间通信通常涉及到内存同步,这可能导致阻塞和上...

    Real-time Big Data Analytics 无水印pdf 0分

    Storm的简单模式包括连接和批处理,通过这些模式可以方便地进行实时数据处理。Storm还提供了持久化选项,如JDBC持久化框架,保证了即使在系统崩溃的情况下,数据也可以被恢复和重新处理。 #### 10. Trident和Storm...

    Java日志体系.docx

    在选择和切换日志框架时,Java的facade模式使得代码可以更容易地进行调整,只需改变底层的日志实现即可。 总的来说,Java日志体系是一个复杂的领域,包含多种框架和接口,每个都有其优点和适用场景。理解这些框架的...

    Java框架研发思考

    多层架构(如MVC模式)的出现是为了更好地组织代码,使得逻辑清晰,并便于后续的维护与扩展。然而,随着应用规模的增长和技术的演进,简单的多层架构逐渐暴露出不足之处。例如,在典型的Web应用中,一个简单的CRUD...

    logback.jar

    logback支持异步日志记录,通过使用LMAX Disruptor库,可以实现低延迟的日志写入,这对于高并发的应用场景非常有利。 **6. Appender和Layout** 在logback中,Appender负责将日志信息输出到特定的目标,如...

Global site tag (gtag.js) - Google Analytics