2

我试图弄清楚 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是一个简单的工作流链:一个事件由 产生P2C2a对其执行一些计算,对其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
4

1 回答 1

0

对于你的第一个问题,我相信WorkerPool会这样做。本质上,当每个工人变得自由时,它会抓住下一个工作项目。正如您所说,不一定会按顺序完成。但是,我从来没有使用过WorkerPoolin anger,所以我可能是错的。

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

于 2015-01-15T20:22:12.473 回答