工作流程为GenServers

时间:2018-05-18 05:00:18

标签: architecture elixir modeling

所以我偶尔会涉及到Elixir,但我过去一直在努力解决的问题始终是如何使用流程为应用程序建模。考虑到这一点,我想要理智地检查我要做的事情,看看它是否有意义。

所以我正在构建一个简单的工作流应用程序,每个阶段都会有关于它如何流向下一个阶段的规则,它可能收集的状态以及由于状态变化而触发的事件。阶段不是线性的,基本上是任何流程图中的图形。

我首先想到的是流程图,它看起来非常像一个流程集合。

我的想法是将流中的每个阶段建模为自己的GenServer,因为它们是可寻址的,可以保持状态并可以用来执行事件。

如果这是一种明智的做法(如果不是,请告诉我),那么我有几个问题:

  • 由于这是一个图表,每个阶段可以有多个连接的下一个和前一个阶段。我希望这些阶段受到监督,现在我真的要表明我在这里缺乏理解,但我认为主管只监控与之相关的流程,而不是有子流程吗?如果是这种情况,我希望每个阶段都充当GenServer和主管,这可能/合理吗?

  • 有没有办法获取流程的所有子流程?

  • 这是明智的吗?

克里斯

3 个答案:

答案 0 :(得分:1)

GenServers绝对是你可以完成这样的事情的一种方式,但是你必须以这种方式解决一些实现问题。

所以Elixir已经提供了一个更高级别的实现,称为GenStage,这是一件好事。您可以创建具有多个阶段的管道,其中每个阶段都可以充当消费者,生产者或两者。

您还可以在每个阶段中生成更多子进程,或让这些阶段自行完成工作并使用ConsumerSupervisor来监督它们。



您还可以将多个阶段并行运行到其他阶段,其中大部分实施由其自动处理。

以下是一些资源:

答案 1 :(得分:1)

我认为流程树不需要具有相同的图形拓扑。

我要做的是每个图表只使用一个Supervisor,该图表中的所有流程都将由它监督。

使用Supervisor.which_children/1获取主管的所有子进程。

我相信using a Supervisor as a GenServer is a bad practice

答案 2 :(得分:1)

你可能想看看凤凰建立的行为Plug如何运作。基本上,定义的每个函数(插件)都接受并返回一个结构conn,并且一个管道的插件链逐渐构建它/转换它/等。

如果我正确理解你,这个模式会起作用 - 你最初会构建一个struct / map,你只需通过一组逐渐转换它的函数传递它。你也应该能够分支,它不需要是线性的。这样状态保持在一个地方(你需要做的就是保持那个结构,你可以用一个genserver做。)

尽管这样做很诱人,但我会认真避免将每个步骤建模为genserver:这会滥用它们来尝试模拟对象。使用只重建状态的普通函数将更简单,更容易调试,更惯用(this article解释何时使用进程以及何时不使用进程,以及为什么,更详细一点)。