首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >工作流版本化

工作流版本化
EN

Software Engineering用户
提问于 2013-10-08 18:55:19
回答 2查看 942关注 0票数 5

我相信当涉及到工作流引擎时,我有一个基本的误解,如果你能帮我理清的话,我会很感激。我不确定我的误解是特定于我正在使用的工作流引擎,还是一个普遍的误解。我碰巧使用了Windows Workflow Foundation (WWF)。

TLDR-版本

WWF允许您在长期运行的工作流(想想几个月甚至几年)中实现业务流程。启动时,无法更改工作流。但是,什么业务流程在任何时候都不能改变?如果业务流程发生了变化,您不希望您的软件为已经启动的业务流程的“实例”反映此更改吗?我遗漏了什么?

背景

在WWF中,您可以通过组合一组活动来定义工作流。有不同类型的活动 --其中一些是用于流控制的,例如IfElseActivity和WhileActivty,而另一些则允许您执行实际的任务,例如CodeActivity wich允许您运行.NET代码,以及允许您调用web服务的InvokeWebServiceActivity。使用可视化设计器将活动组合到工作流中。您几乎可以从工具箱拖放活动到设计器区域,并将活动连接到彼此。工作流和活动具有输入参数、输出参数和变量。

我们有一个单一的工作流,有时运行几天,但它可能运行5-6个月。WWF负责持久化工作流状态(我们目前正在执行什么活动,变量值是什么等等)。

到目前为止,我认为WWF是有意义的。有些人更喜欢使用可视化设计器来实现业务流程的软件表示,而不是用代码编写所有这些。

,那么有什么问题吗?

我不明白的是以下几点:

WWF旨在处理长期运行的工作流.但同时,WWF没有内置功能,允许您修改正在运行的工作流。因此,如果您使用工作流对业务流程建模并运行6个月,您最好希望业务流程不会改变。因为如果是这样的话,您必须同时执行多个版本的工作流。对我来说,这似乎是一个基本的设计错误,但与此同时,我似乎更有可能误解了一些东西。

对我们来说,这已经产生了一些现实世界的影响:

  • 我们每个月发布新版本,但有些工作流可能运行一年。这意味着我们有几个版本的工作流并行运行,换句话说,有几个版本的业务逻辑。这与在同一系统中同时在生产中运行多个不同版本的代码是一样的,这对用户来说有点难以理解。(取决于他们是在9个月前还是10个月前点击了“开始”按钮,该软件的行为将有所不同)
  • 我们的工作流指的是不同类型的实体,因为WWF现在已经持久化和序列化了这些实体,所以我们不能真正地重构实体,因为这样就无法恢复现有的工作流(反序列化将失败)

我们收到了一些关于如何处理这件事的建议

  • 当我们创建工作流的新版本时,取消所有正在运行的工作流并创建新工作流。但是在我们的工作流程中需要大量的手工工作,如果我们从头开始,很多人不得不重新做他们的工作。
  • 跟踪工作流中已经完成的工作,以及当您创建新的工作流时,跳过已经执行的活动。我觉得这个替代方案可能适用于简单的工作流,但是如果对工作流进行了主要的重构,那么自动找出跳过哪些活动就变得不容易了。
  • 当我们创建一个新版本的工作流,升级旧版本使用新的WWF 4.5功能,以升级工作流。但是,我们将不得不跳过使用视觉设计器并编写代码将活动注入到工作流中的正确位置。根据MSDN,此升级功能只用于小错误修复,而不是更大的更改。

我遗漏了什么?

EN

回答 2

Software Engineering用户

发布于 2013-10-08 19:51:47

tl;dr:长期运行的工作流预计不会在其生命周期内发生变化。如果它们可能会改变,那么将它们分解成更小、更短的工作流,并将它们链接在一起,从而形成更大的工作流。

改变运行逻辑是很难的

为什么您的计算机系统有时需要重新启动?因为你不能在使用的时候更换设备驱动程序。你怎么才能避开这一切?通过使事物不可变和编写功能风格的程序。

Erlang编程语言是专为在程序运行时升级而设计的。它是怎么做到的?通过在内存中维护不可变的函数实例。当您在Erlang中对程序进行热修补时,Erlang只需维护现有的功能实例,直到它们完成执行。函数的任何新实例都将使用该函数的新版本,而且由于函数是不可变的,因此在过渡期间可以确保稳定性。

请注意,这将无助于您的工作流,因为您仍然无法在现有工作流运行时对其进行热修补。热修补是指整个功能系统,而不是运行函数的单个实例。您的工作流(本质上是一个长期运行的函数)仍然必须先完成执行。

正如您已经指出的,对运行工作流的更改的目的是进行一些小的调整,而不是对工作流进行大量的更改。

票数 1
EN

Software Engineering用户

发布于 2013-10-08 21:22:25

跟踪工作流中已经完成的工作,以及当您创建新的工作流时,跳过已经执行的活动。我觉得这个替代方案可能适用于简单的工作流,但是如果对工作流进行了主要的重构,那么自动找出跳过哪些活动就变得不容易了。

问题是,它可以变得毛茸茸的,甚至手动,以确定哪些活动可以跳过。例如,如果旧工作流中的当前活动在新工作流中没有等效的活动怎么办?所以我建议你采取一种综合策略:

  • 尽可能使用“跟踪和跳过”方法。
  • 在不可能的情况下使用“取消&重新启动”
  • 对于特殊情况,您可以尝试创建子工作流,以避免完全重新启动,这是专为在特定活动中继续已启动(旧)工作流而设计的,但不需要从头开始重新启动。
  • 尽量保持“转换点”的数量(参与者必须从旧的工作流版本更改到新的工作流版本的活动)--确保您的参与者到达其中的一个点,直到旧的工作流被新版本所取代。在新版本中,过渡点应该始终有一个挂件。这将有助于上述所有情况。
票数 1
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/213805

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档