Java 具有2个生产者的Disruptor,每个生产者提供不同的依赖子图?

Java 具有2个生产者的Disruptor,每个生产者提供不同的依赖子图?,java,parallel-processing,circular-buffer,disruptor-pattern,Java,Parallel Processing,Circular Buffer,Disruptor Pattern,我试图找出Disruptor是否适合我的应用程序:一个相当复杂的负载生成器,用于长时间对高性能数据库进行基准测试。破坏者模式很有吸引力,因为: 高通量 低延迟 无垃圾/可预测的长时间运行行为 应用程序拓扑的简化版本如下所示: ==P1=== 由P1馈送的系统组件有一个生产者馈送多个并行消费者(当前为执行者)。每个事件都应该由其中一个使用者精确地处理一次。排序约束是:如果A在B之前生成,那么A将在B之前开始执行,但是B可能首先完成 处理事件后,它被转发到最后一个阶段,Cx。将Cx看作一个减速机

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

  • 高通量
  • 低延迟
  • 无垃圾/可预测的长时间运行行为
应用程序拓扑的简化版本如下所示:

==P1===

P1
馈送的系统组件有一个生产者馈送多个并行消费者(当前为
执行者
)。每个事件都应该由其中一个使用者精确地处理一次。排序约束是:如果A在B之前生成,那么A将在B之前开始执行,但是B可能首先完成

处理事件后,它被转发到最后一个阶段,
Cx
。将
Cx
看作一个减速机/记录器:它必须按顺序处理事件,因为它所处理的数据结构不是线程安全的

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

我倾向于使用
WorkerPool

==P2===

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

问题2:是否可能有一个中断器和两个生产者,其中每个生产者提供不同的依赖关系子图?

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

问题4:如果问题2和问题3的答案都是否定的,那么有没有办法使该拓扑与干扰器一起工作?

提前谢谢

--供参考--

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


对于您的第一个问题,我相信
WorkerPool
可以做到这一点。基本上,当每个工人都获得自由时,他们就会抓住下一个工作项。正如你所说,这项工作不一定按顺序完成。然而,我从来没有在生气时使用过
WorkerPool
,所以我可能在这方面错了


对于第二个问题,如果您在概念上用另一个中断器(环形缓冲区)替换了
Cx
,并将
Cx
挂起,这是否满足您的其他要求?也就是说,将
C1[a-e]
完成的工作发布给另一个干扰器,并将
C2b
完成的工作发布给同一个干扰器。

谢谢@dty,关于第二个问题,是的,
Cx
部分实际上已经作为另一个干扰器实现了,虽然第一部分还没有被制作成破坏者(好的老式队列和执行者),但还没有时间记录下来,你的意思是每个制作人有一个破坏者,对吗?然后还有一个附加的,用于
Cx
          C1a
          C1b  
 P1 ----> C1c 
          C1d \
          C1e  \
                \
                 \   
                  \    
                   \ 
                    \ 
                     \
                      Cx
                     /
 P2 --> C2a --> C2b /
        C1a --> C1b
        C2a --> C2b  
 P1 --> C3a --> C3b --> Cx
        C4a --> C4b
        C5a --> C5b