我试图弄清楚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
答案 0 :(得分:0)
对于您的第一个问题,我相信WorkerPool
会这样做。基本上,当每个工人变得自由时,它会抓住下一个工作项。如你所说,不一定按顺序完成。但是,我从未在愤怒中使用WorkerPool
,所以我可能错了。
对于您的第二个问题,如果您在概念上将Cx
替换为另一个破坏者(环形缓冲区)并将Cx
悬挂在其后面,那么这是否符合您的其他要求?也就是说,将C1[a-e]
完成的工作发布给另一个破坏者,并将C2b
完成的工作发布给同一个破坏者。