具有2个生成器的Disruptor,每个生成器都提供不同的依赖子图?

时间:2015-01-03 01:58:40

标签: java parallel-processing circular-buffer disruptor-pattern

我试图弄清楚Disruptor是否适合我的应用程序:一个相当复杂的负载生成器,用于长时间对高性能数据库进行基准测试。 Disruptor模式很有吸引力,因为:

  • 高吞吐量
  • 低延迟
  • 没有垃圾/可预测的长时间运行行为

应用程序拓扑的简化版本如下:

          C1a
          C1b  
 P1 ----> C1c 
          C1d \
          C1e  \
                \
                 \   
                  \    
                   \ 
                    \ 
                     \
                      Cx
                     /
 P2 --> C2a --> C2b /

=== P1 ===

P1提供的系统组件有1个生产者为许多并行消费者提供服务(目前为Executor)。每个事件应由其中一个消费者处理一次。排序约束是:如果A在B之前产生,那么A将在B之前开始执行,但是B可能首先完成。

处理完事件后,会将其转发到最后阶段Cx。将Cx视为reducer / logger:它必须按顺序处理事件,因为它所处理的数据结构不是线程安全的。

问题1:使用Disruptor处理C1a-C1e的最佳方式是什么?

使用WorkerPool是我倾向于的。

=== P2 ===

P2提供的系统组件是一个简单的工作流链:一个事件由P2生成,C2a对其执行一些计算,C2b执行进一步的计算它,最后转发给Cx

问题2:是否有可能让2个Disruptor拥有2个生产者,每个生产者提供不同的依赖子图?

问题3:如果问题2的答案为否,是否可以在两个不同的干扰者之间共享消费者Cx,如果是,如何?

问题4:如果问题2和答案的答案都是问题3是否,是否有任何方法可以使此拓扑与Disruptor一起使用?

提前致谢!

- 供参考 -

这不是解决方案,而是相关的。对于任何感兴趣的人,this blog都会解释如何创建半复杂的工作流程,例如:

        C1a --> C1b
        C2a --> C2b  
 P1 --> C3a --> C3b --> Cx
        C4a --> C4b
        C5a --> C5b

1 个答案:

答案 0 :(得分:0)

对于您的第一个问题,我相信WorkerPool会这样做。基本上,当每个工人变得自由时,它会抓住下一个工作项。如你所说,不一定按顺序完成。但是,我从未在愤怒中使用WorkerPool,所以我可能错了。

对于您的第二个问题,如果您在概念上将Cx替换为另一个破坏者(环形缓冲区)并将Cx悬挂在其后面,那么这是否符合您的其他要求?也就是说,将C1[a-e]完成的工作发布给另一个破坏者,并将C2b完成的工作发布给同一个破坏者。