常见问题解答¶
什么是 Mistral?¶
Mistral 是一种任务管理服务,也可以称为工作流服务。大多数业务流程由多个不同的互连步骤组成,这些步骤需要按照特定顺序执行。可以将此类流程描述为一组任务和任务关系,并将其上传到 Mistral,以便它负责状态管理、正确的执行顺序、任务分发和高可用性。Mistral 还提供灵活的任务调度,以便我们可以根据指定的时间表(例如,每周日下午 4:00)运行流程,而不是立即运行它。我们将任务和它们之间的依赖关系集合称为工作流。独立的路径称为流程,Mistral 可以并行执行它们。
Mistral 的用户有哪些?¶
潜在的 Mistral 用户包括:开发者。包括那些在 OpenStack 服务上工作以及在租户虚拟机中运行的开发者。开发者使用 Mistral DSL/API 来访问它。系统集成商。他们使用特殊脚本或手动使用 Mistral CLI/UI 自定义与部署相关的工作流。系统管理员可以通过额外的工具集使用 Mistral 来执行常见的管理任务。这可以是分布式 cron、批量部署任务、备份等。
Mistral 与 OpenStack 有什么关系?¶
Mistral 最初是在 OpenStack 社区内启动的。它仍然在许多 OpenStack 项目中用于各种目的。Mistral 与 OpenStack 集成:使用 Keystone 身份服务进行身份验证/授权,并使用操作与所有主要的 OpenStack 服务(如 Nova、Neutron、Heat 等)进行交互。
为什么将业务流程卸载到第三方服务?¶
原因 1:高可用性。典型的应用程序工作流由许多独立任务组成,例如收集数据、处理、资源获取、获取用户输入、报告、发送通知、复制数据等。所有这些步骤都必须在适当的时间发生,因为它们相互依赖。许多这样的流程可以并行运行。现在,如果您的应用程序在中间崩溃或发生断电,您的业务流程将在未知的阶段和未知的状态下终止。因此,您需要在一些外部持久存储(如数据库)中跟踪每个流程的状态,以便可以从崩溃的地方恢复它(或回滚)。您还需要一些健康监控工具来监视您的应用程序,如果它崩溃,则在另一个实例上安排未完成的流程。Mistral 可以开箱即用地做到这一点,而无需为每个应用程序一次又一次地重新发明轮子。
原因 2:可扩展性。大多数工作流的步骤可以并行执行(例如,工作流中的不同路径)。Mistral 可以将这些任务的执行分布到您的应用程序的实例中,以便整个执行过程可以扩展。
原因 3:可观察的状态。由于流程状态是在应用程序外部跟踪的,因此它变得可观察。在任何给定时刻,系统管理员都可以访问有关当前正在发生的事情、哪些任务处于挂起状态以及哪些任务已经执行的信息。您可以获取有关业务流程的指标并对其进行分析。
原因 4:调度。使用 Mistral,您可以安排流程定期运行或在未来的固定时间运行。您可以让执行由外部健康监控系统中的警报条件触发,或者当您的邮箱中收到新邮件时触发。
原因 5:依赖管理卸载。由于您将任务管理卸载到外部服务,因此您不必提前指定所有触发器和操作。例如,您可以说“如果我的域名宕机 1 分钟,则必须触发此任务”,而无需指定如何获取事件。系统管理员可以设置 Nagios 来监视您的域名并触发操作,稍后用 Ceilometer 替换它,而您的应用程序不会受到影响,甚至不知道更改。管理员甚至可以使用 CLI 或 UI 控制台手动触发任务。或者另一个例子是,每次流程达到期望状态时都触发一个任务,并让管理员配置在那里需要发生什么(例如发送通知邮件,稍后用短信替换)。
原因 6:开放额外的集成点。一旦您的业务流程转换为 Mistral 工作流,就可以被其他人访问,其他应用程序可以设置自己的工作流,以便在您的应用程序达到特定状态时触发。例如,假设 OpenStack Nova 声明了一个用于创建新 VM 实例的工作流。一个应用程序(或系统管理员)可以挂接到“完成”任务,以便每次 Nova 生成另一个实例时,您都会收到通知。或者假设您希望您的用户根据外部计费系统中的信息拥有灵活的实例配额。通常,您需要修补 Nova 以访问您的计费系统,但使用 Mistral,您可以更改 Nova 的工作流,以便它包含执行此操作的自定义任务。
原因 7:形式化的任务图更容易管理和理解。它们可以被可视化、分析和优化。它们简化了程序开发和调试。您可以对程序工作流进行建模,用桩替换任务操作,轻松模拟外部依赖关系,进行任务分析。
为什么不使用 Celery 或类似的东西?¶
虽然 Celery 是一个分布式任务引擎,但它被设计为在预先安装的专用工作器上执行自定义 Python 代码。再说一次,这与 Mistral 的用例不同,Mistral 假设任务可以在共享服务上执行,并且它们不需要(或不允许)提前上传自定义代码。换句话说,如果现在开始,Celery 本身就可以构建在 Mistral 之上。
Mistral 与 Amazon SWF 有什么关系?¶
Amazon SWF 共享许多与 Mistral 相同的理念,但实际上,它被设计为面向语言的(Java、Ruby、Python)。没有例如 Java SDK 将其功能作为一组 Java 注解和接口暴露出来,很难且毫无意义地使用 SWF。从这个意义上说,SWF 比 Mistral 更接近 Celery。另一方面,Mistral 旨在更简单、更用户友好。我们希望拥有一种可以在任何编程语言中无需 SDK 即可使用的服务。同时,始终可以基于酷炫的功能(如 Python 装饰器、Java 注解和方面)实现额外的方便的面向语言的绑定。
如何让 Mistral 了解我的工作流?¶
工作流使用基于 YAML 的 Mistral 工作流语言进行描述。有一个 REST API 用于上传工作流、执行它们以及对其进行运行时修改。工作流语言描述了
工作流
任务
任务之间的转换(一旦任务完成,接下来应该运行什么)。适用于“直接”工作流类型。
任务之间的依赖关系(在可以执行此任务之前需要运行哪些任务)。适用于“反向”工作流类型。
应用于任务运行方式的各种策略。例如,“重试”策略有助于在发生故障时多次运行任务。
可用于转换输入或输出的临时操作,以方便起见。
什么是 Mistral 任务?¶
任务是用 Mistral 工作流语言编写的实体,定义了特定的工作流步骤。每个任务都有
名称
可选的标签名称
它依赖的反向工作流中的任务列表或直接工作流中的转换列表
可选的 YAQL 表达式,用于从当前数据上下文中提取数据,以便将其作为任务执行输入
可选的任务操作(要执行的具体工作)
可选的任务工作流。如果指定,则该任务与另一个工作流执行(子工作流)相关联。
什么是 Mistral 工作流?¶
一组任务和规则,根据这些规则运行这些任务。每个工作流都旨在解决特定的领域问题,例如自动扩展 Web 应用程序。
什么是 Mistral 工作簿?¶
工作簿是一种方便的包,用于在一个文件中携带多个工作流和临时操作。工作簿也可以用作命名空间。
什么是 Mistral 操作以及 Mistral 如何执行它们?¶
操作是在特定任务运行时要执行的操作。示例包括
运行 shell 脚本
发送电子邮件
调用您的应用程序的 URI。将 AMQP(RabbitMQ)消息发送到某个队列。
其他类型的信号(电子邮件、UDP 消息、轮询等)。
Mistral 可以扩展为包含其他通用操作,例如调用 Puppet、Chef、Ansible 等等。
是否可以在 Mistral 中组织不同任务之间的数据流?¶
是的,属于同一工作流的任务可以获取 JSON 结构作为输入,使用 YAQL 表达式 (https://pypi.python.org/pypi/yaql) 查询该结构中对该任务感兴趣的子集,并将其传递给相应的操作。一旦操作完成处理,它将使用类似的 JSON 格式返回结果。在这种情况下,Mistral 充当数据流中心,将一个任务的结果分派到其他任务的输入。
Mistral 是否提供运行嵌套工作流的机制?¶
Mistral 可以启动嵌套工作流,而不是执行与任务关联的具体操作。也就是说,给定发送到任务的输入,Mistral 会使用该输入启动一个新的工作流,并在完成后跳回父工作流并从同一点继续执行。在编程中最接近的类比是从另一个方法调用一个方法,传递所有必需的参数并选择性地获取返回结果。值得注意的是,嵌套工作流与父执行中的其余活动并行工作,并且它具有可通过 API 观察到的自己的隔离执行上下文。