我试图找出Disruptor是否适合我的应用程序:一个相当复杂的负载生成器,用于对高性能数据库进行长时间基准测试。Disruptor模式之所以吸引人,是因为:
应用程序拓扑的简化版本如下:
C1a C1b P1 ----> C1c C1d \ C1e \ \ \ \ \ \ \ Cx / P2 --> C2a --> C2b /
=== P1 ===
由P1提供的系统组件有一个生产者为多个并行用户(目前是一个Executor)提供信息。每个事件都应该被正确地处理一次,由其中一个使用者处理。排序约束是:如果A是在B之前产生的,那么A将在B之前开始执行,但是B可以先完成。
在处理一个事件之后,它将被转发到最后一个阶段,Cx。将Cx看作一个还原器/记录器:它必须按顺序处理事件,因为它所使用的数据结构并不是线程安全的。
C1a-C1e**?**问题1:使用消毒器处理的最佳方法是什么
我倾向于使用WorkerPool。
=== P2 ===
P2提供的系统组件是一个简单的工作流链:一个事件由P2生成,C2a对其执行一些计算,C2b对其进行进一步的计算,最后将其转发给Cx。
问题2:是否可能有一个具有两个生产者的Disruptor,其中每个生产者提供一个不同的依赖子图?
问题3:如果问题2的答案是否定的,那么是否可以在两个不同的干扰者之间共享一个消费者- Cx**,?如果是的话,如何共享?**
问题4:如果问题2和问题3的答案都是否定的,那么是否有任何方法可以使此拓扑与Disruptor一起工作?
提前感谢!
--供参考--
这不是一个解决方案,而是相关的。对于任何感兴趣的人,这个博客解释了如何创建一个半复杂的工作流,例如:
C1a --> C1b C2a --> C2b P1 --> C3a --> C3b --> Cx C4a --> C4b C5a --> C5b
发布于 2015-01-15 20:22:12
对于你的第一个问题,我相信WorkerPool会做到的。本质上,当每个工作人员获得自由时,它就会抓取下一个工作项。就像你说的,这不一定是按顺序完成的。然而,我从来没有在愤怒中使用过WorkerPool,所以我在这方面可能是错的。
对于第二个问题,如果您在概念上用另一个中断器(环形缓冲区)替换了Cx,并将Cx挂在后面,这是否符合您的其他要求?也就是说,将C1[a-e]所做的工作发布到另一个中断器上,并将C2b所做的工作发布到相同的干扰器中。
https://stackoverflow.com/questions/27750989
复制相似问题