95

我想知道您(SO 读者)使用 Workflow Engines 解决的具体问题,以及如果您不使用自己的库/框架,您使用了哪些库/框架。我还想知道工作流引擎何时不是最佳选择,以及您是否/如何选择更简单的东西,例如使用状态机的 TaskList/WorkList/Task-Management 类型的应用程序。

问题:

  • 您使用工作流引擎解决了哪些问题?
  • 您使用了哪些库/框架?
  • 什么时候像系统这样更简单的状态机/任务管理就足够了?
  • 奖励:您是如何/如何区分任务管理工作流引擎的?

我正在寻找第一手经验。

我检查过的一些资源:

4

8 回答 8

63

我也有偏见,因为我是StonePath的主要作者。

我为美国国务院、日内瓦人道主义排雷中心、几家财富 500 强客户以及最近的华盛顿特区公立学校系统开发了工作流应用程序。每次我看到一个试图成为业务流程的主要参考的“工作流引擎”时,我都会看到一个组织在努力解决这个工具。这可能是因为这些解决方案一直是供应商/产品驱动的,然后最终会得到一个由“顾问”组成的战术团队不断为应用程序提供服务……但正因为如此,当我听到承诺“将工作流定义集中在一个地方并使其可重复”的基于流程的工具的好处。

也就是说,我非常喜欢 Ruote - 我已经关注该项目一段时间了,如果我需要这种解决方案,它将是我愿意尝试的下一个工具。StonePath 的目的与 ruote 截然不同——Ruote 通常对 Ruby 有用,StonePath 的目标是 Rails,这是用 Ruby 编写的 Web 框架。Ruote 是关于长期业务流程及其相关定义的,而 StonePath 是关于管理基于状态的工作流和任务的。坦率地说,我认为与外部观察的区别可能是微妙的——很多时候,相同类型的业务流程可以用任何一种方式表示——尽管基于状态和任务的模型倾向于映射到我的心智模型。

让我描述一下基于状态的工作流程的亮点。简而言之,想象一个围绕抵押贷款或护照更新等处理的工作流程。随着文件“在办公室周围”移动,它从一个州传到另一个州。想象一下,如果您负责该文档,而您的老板每隔几个小时就要求您更新状态,并希望得到一个简短的回答……您会说“它在数据输入中”……“我们正在检查申请人的证书现在”......“我们正在等待质量审查”......“我们完成了”......等等。这些是基于状态的工作流中的状态。我们通过转换从一个状态转移到另一个状态——比如“批准”、“申请”、“回扣”、“拒绝”等等。这些往往是动作动词。

基于状态/任务的工作流的下一部分是创建任务。任务是一个工作单元,通常具有截止日期和处理说明,它将工作项目(例如贷款申请或护照续签)连接到“收件箱”用户。任务可以彼此并行或顺序发生,我们可以在进入状态时自动创建任务,在人们意识到工作需要完成时手动创建任务,并要求任务完成才能进入新状态。所有此类行为都是可选的,并且是工作流定义的一部分。

兔子洞可以比这更深,我为实用程序员杂志 PragPub 的第 4 期写了一篇关于它的文章。查看上面的 reo 链接以获取该文章的更新 PDF。

在过去几个月与 StonePath 的合作中,我发现基于状态的模型可以很好地映射到静止的 Web 架构 - 特别是,任务和状态转换很好地映射为嵌套资源。期待看到我在这个主题上的未来写作。

于 2010-03-03T02:17:43.473 回答
31

我有偏见,我是ruote的作者之一。

变体 1) 附加到资源(文档、订单、发票、书籍、家具)的状态机。

变体 2) 附加到名为任务的虚拟资源的状态机

变体 3) 解释工作流定义的工作流引擎

现在您的问题被标记为“BPM”,我们可以将其扩展为“业务流程管理”。这种管理是如何在每个变体中发生的?

在变体 1 中,业务流程(或工作流)分散在应用程序中。附加到资源的状态机强制执行工作流的某些方面,但仅执行与资源相关的那些方面。可能有其他资源具有自己的状态机,遵循相同的业务流程。

在变体 2 中,工作流可以集中在任务资源周围,并由围绕该资源的状态机表示。

在变体 3 中,通过解释称为工作流定义(或业务流程定义)的资源来制定工作流。

当业务流程发生变化时会发生什么?是否值得拥有一个业务流程是可管理资源的工作流引擎?

大多数状态机库都有 1 组状态 + 转换。工作流引擎大部分是工作流定义解释器,它们允许多个不同的工作流一起运行。

改变工作流程的成本是多少?

变体不是相互排斥的。我见过很多例子,工作流引擎会改变多个资源的状态,其中一些资源由状态机保护。

对于人工任务,我也经常使用变体 3 + 2:工作流引擎在运行流程实例的某些时候,将任务(工作项)交给人工参与者(资源任务已创建并置于“就绪”状态) .

您可以单独使用变体 2(任务管理器变体)。

我们还可以提到变体 0),其中没有状态机,没有工作流引擎,并且业务流程分散和/或硬编码在应用程序中。

你可以问很多问题,但如果你不花时间阅读答案,不花时间去尝试和实验,你就不会走得太远,也永远不会获得什么时候使用的天赋这个或那个工具。

于 2010-03-03T00:12:40.373 回答
4

在我之前从事的一个项目中,我在医疗保健行业的一组政府表格中添加了一些工作流类型规则。

最终用户需要填写表格,并且根据一些答案,其他表格计划在以后填写。还有一些外部事件会取消预定的表格或安排新的表格。

样品流程:

患者入院 -> 安排初始评估表 -> 安排季度审查表 -> 患者死亡 -> 取消审查 -> 安排出院评估表

许多其他规则基于诸如患者年龄、入院地点等因素。

这是一个 ASP.NET 应用程序,规则基本上是数据库中的一个表。我添加了脚本,因此脚本将在表单完成时运行以确定下一步要做什么。这是一个可怕的设计,对于合适的工作流引擎来说是完美的。

于 2010-03-03T00:34:22.747 回答
4

我是我们最初在 Uber 作为 Cadence 开发的开源Temporal Workflow Engine的作者之一。Temporal 与大多数现有工作流引擎之间的区别在于,它以开发人员为中心,非常灵活和可扩展(每秒更新数万次,开放工作流多达数十亿)。工作流被编写为面向对象的程序,并且引擎确保在主机故障的情况下完全保留工作流对象的状态,包括线程堆栈和局部变量。

您使用工作流引擎解决了哪些问题?Temporal 几乎用于任何超出单个请求回复的后端应用程序。使用示例如下:

  • 分布式 CRON 作业
  • 管理机器学习/数据管道
  • 对业务事件作出反应。例如优步的旅行活动。工作流可以根据接收到的事件累积状态,并在必要时执行活动。
  • 服务部署到 Mesos/Kubernetes
  • CI 流水线实现
  • 确保在收到请求时完成多个服务调用。包括SAGA模式实现
  • 管理人工任务(类似于 Amazon MTurk
  • 媒体处理
  • 客户支持工单路由
  • 订单处理
  • 类似ChaosMonkey的测试服务

和许多其他人

另一组用例基于移植现有工作流引擎以在 Temporal 上运行。实际上,任何现有的引擎工作流规范语言都可以移植到 Temporal 上运行。这样,单个后端服务就可以为多个特定领域的工作流系统提供支持。

您使用了哪些库/框架?

Temporal 是用 Go 编写的自包含服务,带有GoJavaPHPTypescript客户端 SDK(.NET 和 Python 将于 2022 年推出)。唯一的外部依赖是存储。支持 Cassandra、MySQL 和 PostgreSQL。Elasticsearch 可用于高级索引。

Temporal 还支持异步跨区域(使用 AWS 术语)复制。

什么时候像系统这样更简单的状态机/任务管理就足够了?

开源 Temporal 服务可以是自托管的,也可以使用 temporal.io 云产品。因此,构建任何自定义状态机/任务管理的开销总是高于使用 Temporal。在公司外部,需要为其设置服务和存储。如果您已经有一个 SQL 数据库,那么通过 docker 映像进行服务部署是很简单的。docker 还用于在个人计算机或笔记本电脑上运行本地 Temporal 服务以进行开发。

于 2019-04-03T02:58:56.977 回答
3

我是Imixs-Workflow的作者之一。Imixs-Workflow 是一个基于 BPMN 2.0 并完全集成到 Java EE 技术栈中的开源工作流引擎。
我自己开发工作流引擎已经 10 多年了。我将尝试简短地回答您的问题:

> 您使用工作流引擎解决了哪些问题?

当我开始考虑工作流引擎时,我的个人目标是避免在我的应用程序中硬编码业务逻辑。业务应用程序中的许多东西都可以重用,因此保持它们可配置是有意义的。例如:

  • 发出通知
  • 查看打开的任务
  • 将任务分配给某人
  • 描述当前任务

从这个功能列表中,您可以看到我正在谈论以人为中心的工作流程。简而言之:以人为中心的工作流引擎回答了以下问题:谁负责一项任务以及接下来需要通知谁?这些是业务需求中的典型问题。

>您使用了哪些库/框架?

5 年前,我们开始重新实现专注于BPMN 2.0的 Imixs-Workflow 引擎。BPMN 是流程建模的通用标准。令我惊讶的是,我们突然能够描述甚至可以可视化和执行的高度复杂的业务流程。我建议大家使用 BPMN 对业务流程进行建模。

> 什么时候像系统这样更简单的状态机/任务管理就足够了?

如果您只想跟踪业务对象的状态,一个简单的状态机就足够了。当您开始将“状态”属性引入对象模型时就是这种情况。但是,如果您需要具有职责、日志记录和流控制的业务流程,那么状态机就不再足够了。

> 奖励:您是如何/如何区分任务管理和工作流引擎的?

这正是这里提到的许多工作流引擎不同的地方。对于以人为中心的工作流程,您通常需要任务管理来在人类参与者之间分配任务。对于流程自动化,这一点并不那么重要。如果引擎执行某些任务就足够了。任务管理和工作流引擎无法比较,因为任务管理始终是工作流引擎的功能。

于 2019-05-29T22:17:00.490 回答
2

检查rails_workflow gem - 我认为这与您搜索的内容很接近。

于 2015-03-03T09:05:00.817 回答
1

我推出了自己的工作流引擎来支持文档的分阶段处理——编目、发送图像处理(我们使用编辑软件)、如果需要发送到验证、然后发布并最终发回给客户。在我们的例子中,我们有一大堆文件要处理,所以有时我们需要单独运行每个服务来控制交付和资源使用。概念简单,但需要高性能和分布式处理,我们找不到任何适合我们的现成产品。

于 2010-03-01T02:28:56.417 回答
1

我有使用Activiti BPMN 2.0 引擎在网络节点基础设施中处理高性能和高吞吐量数据传输过程的经验。基本任务是允许配置和监视这种传输过程并控制每个网络节点(即请求节点1 通过特定的传输层向节点2 发送数据文件)。

一次可能有数千个进程在运行,并且每天总共有数万或数十万个进程。

有许多不同的流程定义,但不一定要求系统操作员可以创建自定义工作流程。因此,BPM 引擎本身的主要用例是稳健、可扩展并允许监控每个流程。

最后它基本上工作了,但我们从那个项目中学到的是 BPMN 平台,或者更确切地说是 Activiti 引擎,对于这样一个高吞吐量系统来说并不是最好的选择。

主要挑战是任务执行优先级、数据库锁定、执行重试等与 BPM 本身有关的少数几个问题。所以我们必须开发对这些的自定义处理,例如:

  • 在 BPM 中处理节点对于给定任务没有空闲工作器或节点根本没有运行的情况下的重试。
  • 在单个进程中执行并行传输任务并同步结果(成功/失败)。

我不知道其他 BPMN 引擎是否更适合这种情况,因为 BPMN 主要用于涉及用户交互的长时间运行的业务任务,其中性能可能与我们的情况不同。

于 2017-11-02T17:02:22.757 回答