2017-09-29 50 views
1

我需要在.net中构建一个动态工作流应用程序,该应用程序基本上允许创建,监视,暂停,重新启动,保留并动态更新工作流程。工作流的每个节点都是一项要求苛刻的计算任务,可能需要几个小时,工作流将由至少20个节点组成。在.net中构建工作流应用程序的最佳方式

目前看来,最好的解决方案是使用WF4,但环顾四周,我发现在F#,Orleans或Akka.NET中发现基于代理的编程非常有吸引力来实现工作流程解决方案,与WF4相反没有太多的学习内容。开始使用基于代理的编程解决方案是否是一个好主意,还是应该继续使用WF4?

+0

他们真的是不同的东西,我不是很熟悉WF4的呃......我个人会从WF4开始,“这可能需要几个小时”听起来像生活在工作流世界中的东西,所有“long running transatction”类型的花里胡哨 – user2088029

+0

看起来WF4有一个分歧的观点:https://stackoverflow.com/questions/104099/when-to-use-windows-workflow-foundation(看第二个答案)和https://stackoverflow.com/questions/513657/why-use-windows-workflow – Mario

回答

2

<edit>

要回答你的问题上建立一个基于代理的模式,即在我看来,最好的办法。它使调试和维护变得更容易,同时分离出整个操作的“驱动程序”(即,您可以换出WF并用另一个设备替换它)。

</edit>

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

概括地说,像这样的方法:

  • 有一个“编排”的过程,负责启动新的工作流程和保湿坚持工作流程。
  • 并有一个“代理”进程(或进程),实际上运行你长时间运行的任务。

的编排流程

这个过程是充电开始一个全新的流实例的。您的工作流程只需启动代理程序即可完成实际工作。工作流实例会休眠。

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

实施编排流程的一种方式是作为Web服务。代理程序完成后,代理程序可以轻松回调它以唤醒沉睡的工作流程实例。

在代理过程中

这个过程中会有执行工作的实际诀窍。当由编排过程调用时,会给它一些信息以知道应该执行哪个上下文(即业务对象)。完成后,代理通知编排流程已完成。

回到编排流程

当代理完成了它的任务,它使一个电话回编排流程的情况下准备继续前进到下一项在流动。然后,编排过程将水合该上下文的工作流程,并恢复它。

工作流程可能会决定另一个长时间运行的任务接下来启动,从而激活另一个代理程序进程以委托任务,然后再次休眠该工作流程实例。此循环将继续,直到工作流实例结束。

“动态”工作流部分

我想你指的是更新的“正在进行中”的工作流程,对不对?如果是这样,WF4.5有这个能力。我从来没有实现过(但),但从我读过的内容来看,这是可行的。

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

+0

谢谢,我想我明白你的观点。就我而言,工作流的节点将主要是R脚本,我将需要包装以提供一些选项。然后我需要提供工作流程的编排。我的观点是,即使WF提供了非常好的功能(持久性和动态更新),它看起来并不友好。那么,仅仅使用WF来处理orchastration部分还是应该使用其他类似Akka.Net的东西? – Mario

+0

有一个学习曲线来拾取WF,但它并不疯狂棘手。光明的一面是它提供了很多开箱即用的功能,这是一个巨大的优势。警告是一些文档狩猎,如果需要某些功能。有很多关于它的各种事情的博客,所以这些日子还是很有帮助的。我说如果你能找到你可能使用它的功能的文档,那就去做吧。 – ajawad987

+0

@ ajawad987的这种“编排”思想是杀手锏,它使用WF来实现它:长时间运行的进程/事务。有了它,你可以避免大部分痛苦的部分(编写自定义活动等)。当大多数逻辑都在WF之外(在“代理”中)时,您不需要经常刷新WF,它只是长时间运行过程的主干。本周的一部分是可扩展性和存储:我创建了一个github项目,将WF移植到Orleans,Orleans提供存储,调度程序并提供可扩展性和可移植性。 https://github.com/OrleansContrib/Orleans.Activities – lmagyar

相关问题