【问题标题】:best way to construct a workflow app in .net在 .net 中构建工作流应用程序的最佳方法
【发布时间】:2017-09-29 10:52:29
【问题描述】:

我需要在 .net 中构建一个动态工作流应用程序,它基本上允许创建、监控、暂停、重新启动、持久化和动态更新工作流。工作流的每个节点都是一项高要求的计算任务,可能需要几个小时,并且工作流将由至少 20 个节点组成。

目前,似乎最好的解决方案是使用 WF4,但环顾四周,我发现 F#、Orleans 或 Akka.NET 中的基于代理的编程对于实现工作流解决方案非常有吸引力,与 WF4 相比,有没有那么多管道要学。使用基于代理的编程开始解决方案是个好主意,还是应该继续使用 WF4?

【问题讨论】:

标签: f# workflow-foundation agent akka.net orleans


【解决方案1】:

<edit>

要回答您关于构建基于代理的模型的问题,我认为这是最好的方法。它也使调试和维护更容易,同时分离出整个操作的“驱动程序”(即您可以换掉WF并用另一个设备替换它)。

</edit>

WF4 可用于驱动您长期运行的业务逻辑。我使用过的最佳方法是简单地启动“代理进程”的工作流,当代理工作时,WF 实例休眠等待被代理唤醒。

简而言之,类似这种方法:

  • 拥有一个“编排”流程,负责启动新的工作流程和补充持久的工作流程。
  • 并有一个“代理”进程(或多个进程)实际运行您的长时间运行的任务。

编排过程

这个过程负责启动一个全新的工作流实例。您的工作流程将简单地启动一个代理流程来完成实际工作。然后工作流实例将休眠。

此过程还将等待恢复休眠工作流实例的请求。本质上,工作流实例只会“运行”片刻,并将实际工作委托给其他线程/进程。

实现编排流程的一种方式是作为 Web 服务。它使代理进程可以轻松地在代理完成时回调它以唤醒处于休眠状态的工作流实例。

代理进程

此过程将具有执行工作的实际知识。当编排流程调用时,会向它提供一些信息,以了解它应该针对哪个上下文(即业务对象)执行。完成后,代理会通知编排进程它已完成。

回到编排过程

当代理完成其任务时,它会回调编排流程,表明上下文已准备好移动到流程中的下一个项目。然后,编排过程将水合该上下文的工作流程,并恢复它。

工作流可以决定接下来要启动另一个长时间运行的任务,从而启动另一个代理进程来委派任务,然后再次休眠工作流实例。并且这个循环一直持续到工作流实例结束。

“动态”工作流程部分

我认为您指的是更新“正在进行中”的工作流程,对吗?如果是这样,WF4.5 有能力允许这样做。我(还)从未实现过它,但从我读过的内容来看它是可行的。

这个概念涉及添加一些关于正在执行的工作流版本的元数据。 WF 将负责启动动态活动更新,您可以控制该更新。

【讨论】:

  • 谢谢,我想我明白你的意思了。在我的情况下,工作流的节点将主要是 R 脚本,我需要包装它们以提供一些选项。然后我需要提供工作流程的编排。我的观点是,尽管 WF 提供了非常好的功能(持久性和动态更新),但它似乎对开发人员并不友好。那么,仅将 WF 用于编排部分会更好,还是应该使用 Akka.Net 之类的其他东西?
  • 学习 WF 有一个学习曲线,但这并不是非常棘手。好的一面是它确实提供了很多开箱即用的功能,这是一个巨大的优势。需要注意的是,某些功能需要一些文档搜索。有很多关于它的各种事情的博客,所以现在这是一个加号。我说如果你能找到关于你可能会使用它的特性的文档,那就去吧。
  • @ajawad987 的这种“编排”思想是杀手锏,它使用 WF 的优势:长时间运行的进程/事务。有了它,您可以避免大部分痛苦的部分(编写自定义活动等)。当大部分逻辑都在 WF 之外(在“代理”中)时,您不需要经常刷新 WF,它只是长期运行过程的支柱。本周部分是可扩展性和存储:我创建了一个 github 项目来将 WF 移植到 Orleans,Orleans 提供存储、调度程序并提供可扩展性和可移植性。 github.com/OrleansContrib/Orleans.Activities
  • 我同意,将编排部分与代理部分分开是正确的。对我来说出现的下一个问题是你会用什么来实现代理部分,奥尔良?因为,据我了解,工作流的每个节点都会触发一个代理,但这些代理还需要处理状态持久性和资源来执行它们的工作。例如,代理可能是需要在包含正确 dll 和包的特定集群上执行的计算。
  • 我对使用 Orleans(还)不太了解,因此无法对此发表评论。看起来你想要一个“持久代理”?最简单的方法是将任何状态完整的数据存储在数据库中,并在启动代理时,让代理在执行指定任务之前从数据库中读取状态。编排过程将提供一个“工作上下文 ID”(例如工作流实例 GUID),代理可以使用该 ID 来跟踪其工作内容。底线是将持久性数据保存在数据库中的某处。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-02
  • 1970-01-01
  • 1970-01-01
  • 2011-03-07
  • 1970-01-01
  • 2018-01-13
相关资源
最近更新 更多