使用生成的状态机管理动态条件依赖项?

时间:2016-01-07 20:32:49

标签: node.js state-machine directed-acyclic-graphs

问候SO居民!

我正在尝试对已经超出其原始设计的现有NodeJS应用程序进行大修。我正在努力解决的问题远远超出了我的经验。

系统有大约50个唯一的异步任务,定义为它知道如何执行的各种有限状态机。每个任务都有一组必需的参数可以开始执行,这些参数可以由交互式提示,数据库或之前完成的异步任务的结果提供。

我有一个UI,用户可以在其中定义有向图(“流程”),指定他们想要运行的任务以及他们想要执行的顺序以及与顶点和边缘相关的其他属性,例如在调用子任务之前要评估的额外条件。这些信息存储在第三个普通形式的PostgreSQL数据库中,作为“父+子+属性值”配置,似乎运行得相当好。

由于绝对数量的排列,条件和可能的失败点的荒谬数量,我倾向于将“流程”表达为状态机。我只是对图论和状态机有足够的知识来实现​​它们,但几乎没有背景。

我认为我想要完成的是在收到用户输入根服务后的流程运行时间,以某种方式将图形+属性的数据库表示编译成某种状态机。

为了在不久的将来进一步使问题复杂化,我希望能够“暂停”流程,将其状态保存到内存,将来某个时间将其加载到另一个工作人员上并继续执行。

我认为我接近一个可行的解决方案,但如果你们中的一个善良的人会怜悯一个盲目的傻瓜并指出我正确的方向,我将永远为你负债。

1 个答案:

答案 0 :(得分:1)

几年前,我作为学士和毕业论文解决了类似的问题。我设计了一个Cascade,一个可执行的结构,形成了增长的非循环导向图。您可以在我的论文“Self-generating Programs – Cascade of the Blocks”中阅读相关内容。

基本思想是,每个块都有输入和输出。最初,一些块被插入级联中,输入连接到其他块的输出以形成非循环图。执行块时,它读取其输入(级联将从连接的输出传递值),然后块设置其输出。它还可以将其他块插入级联,并将其输入连接到已存在的块的输出。这应该等于您启动另一个任务并将一些参数传递给它的任务。将输出设置为值的替代方法是从另一个输出转发值(在您的情况下等待某个其他任务的结果,因此可以启动辅助子任务)。