如何在DDD中创建管道流程?

时间:2018-10-15 12:50:00

标签: python domain-driven-design microservices bounded-contexts

使用DDD定义管道过程时遇到一些困难。我的情况如下:

有3个有界上下文:

  • 患者数据管理器:负责检索和管理整个患者的数据,例如mrna,mirna,dna甲基化等等。

  • 注释数据管理:这是有关基因,mirna,蛋白质等的注释。

  • 分析仪:这是一种特殊的分析仪,它使用一些患者的数据并提取一些有用的信息。此外,用户可以创建管道并创建uglin,从而定义一些其他步骤来使用患者数据进行处理。每个步骤都是唯一的,并且只完成一项工作,就像这样:

    管道1:任务1->任务2->任务3->任务4 管道2:任务1->任务3->任务5->任务6

每个任务都可以生成一些数据,因此,该任务必须管理数据,读取和写入数据。

我想通过患者数据管理器上下文来减少任务和任务之间的耦合。

例如:由于数据量大,task1必须在患者数据管理器中获取数据。 task1获取一些数据,对其进行处理,然后获取更多数据,然后再次进行处理。此过程将导致task1保存一些数据。

然后,管道中的下一个任务是task3。 Task3从task1获取全部数据。 taks3处理数据,生成另一个数据。任务3保存它们。管道已完成。

请注意,管道是在运行之前配置的,并且每个任务还​​需要一些数据才能工作并生成一些数据。

我想到了使用命令模式在患者数据管理器上下文中获取数据。关于管道,它有工厂来定义和配置管道,每个任务都有一个用于处理数据的命令和一个用于保存其数据的命令。

我知道因为命令紧密耦合。我曾考虑过使用带消息的编排模式,但是由于流水线,患者数据管理器中的数据量以及每个任务产生的数据量,这确实很难实现。

可以吗?还有更好的解决方案吗?

代码在python中。

非常感谢!

1 个答案:

答案 0 :(得分:0)

DDD与管道没有任何冲突。这个问题在某种程度上是假设的,但我会尽力回答。从技术上讲,您只能具有一个通用任务界面来执行特定于域的任务。例如,请参见下面的样板。

class DomainTask1:
    def __init__(self):
        pass

    def run(self):
        # do something

class DomainTask2:
    def __init__(self):
        pass

    def run(self):
        # do something else

def run_pipeline(pipeline):
    for task in pipeline:
        task.run()

pipeline = [
    DomainTask1(),
    DomainTask2()
]

run_pipeline(pipeline)