我试图弄清楚 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
?
使用 aWorkerPool
是我的倾向。
=== P2 ===
由 馈送的系统组件P2
是一个简单的工作流链:一个事件由 产生P2
,C2a
对其执行一些计算,对其C2b
执行进一步的计算,最后将其转发给Cx
。
问题 2:是否可以有 1 个 Disruptor 和 2 个生产者,每个生产者提供不同的依赖子图?
问题 3:如果问题 2 的答案是否定的,是否可以Cx
在两个不同的破坏者之间共享一个消费者,如果可以,如何?
问题 4:如果问题 2 和问题 3 的答案都是否定的,有没有办法让这个拓扑与 Disruptor 一起工作?
提前致谢!
- 以供参考 -
这不是解决方案,而是相关的。对于任何感兴趣的人,这个博客解释了如何创建一个半复杂的工作流,例如,像这样:
C1a --> C1b C2a --> C2b P1 --> C3a --> C3b --> Cx C4a --> C4b C5a --> C5b