我的系统有很多活动(大约40个)。每个活动要么调用服务,要么执行一些计算。该系统是用Java编写的。目前,所有这些活动都是按顺序执行的,整个过程大约需要2-3秒。我正在尝试优化系统并尝试减少延迟。我注意到一些活动具有数据依赖性,其中一些是独立的。我正在尝试使这些活动并行运行,同时还维护具有数据依赖性的活动的序列。例如,假设活动“A”到“F”按顺序依次执行:
A->B->C->D->E->F (Activities)
1 2 3 4 5 6 (Time Units)
假设A生成的数据由E使用,B生成的数据由F使用,其余活动不依赖于任何其他数据。我不应该按顺序运行这些活动,而应该能够按此顺序并行运行它们 -
A->E
B->F
C
D
1 2 (Time)
因此,系统应该能够以2个时间单位完成整个过程,而不是6个时间单位。是否有任何开源Java框架可用于处理此类工作流,并且可以在数据可用后无缝地执行活动?
答案 0 :(得分:0)
以下是完全用于此目的的框架(称为Dexecutor),您可以参考此{} this和this Dzone文章以了解此用例示例。对于像usecase这样的工作流程,请参考this。
以下是使用Dexecutor的方法。
DexecutorConfig<String, String> config = new DexecutorConfig<>(executorService, new TaskProvider());
DefaultDexecutor<String, String> executor = new DefaultDexecutor<String, String>(config);
executor.addDependency("A", "E");
executor.addDependency("B", "F");
executor.addIndependent("C");
executor.addIndependent("D");
executor.execute(ExecutionConfig.NON_TERMINATING);
免责声明:我是此框架的所有者
答案 1 :(得分:-1)
答案取决于依赖图的拓扑结构。如果它可以在独立的线性序列中拆分,如在您的示例中,则只需将每个序列表示为Runnable,并使用自己的线程运行它们或将它们提交给线程池。
如果序列分支如下:
A->B->C
|
->D->E
然后首先运行序列ABC,并从活动B运行DE。
最复杂的情况是活动取决于两项或多项活动:
A->B -> |
C -> |->D // needs both results from B and C
图中需要一个节点,用于收集结果并在收集所有结果时启动新序列。如果使用线程,则可以使用BlockingQueue.take()
方法将每个依赖关系表示为阻塞队列,并让依赖活动首先从所有输入队列中读取。如果您使用线程池,则可以:
使用Java8 CompletableFuture
类及其方法runAfterBoth
(对于2个依赖项)或allOf
(对于任意数量的依赖项)。
使用一些数据流库(作者,我推荐https://github.com/rfqu/df4j)
自己实现加入节点,这不是什么大问题