工作流命名空间

概述

Mistral 允许在命名空间内创建工作流。因此,只要它们位于不同的命名空间中,就可以创建许多具有相同名称的工作流。当用户已经拥有许多相互连接的工作流(有些是其他工作流的子工作流),并且其中一个工作流名称已被使用,而用户又不想编辑该工作流及其所有引用它的工作流,或者将它们合并到工作簿中时,这非常有用。这是可能的,因为命名空间不是 Mistral 工作流语言的一部分。

如果想要使用命名空间,需要在通过 REST API 或 CLI 运行的相应操作中提供额外的参数。如果未提供,Mistral 将在默认命名空间内运行。

REST API 参数

为了使用命名空间,Mistral 的许多 REST API 方法都具有可选的 namespace 参数

  • 在命名空间内创建工作流定义

    POST /v2/workflows?namespace=<namespace>
    
    <Workflow YAML text>
    
  • 在命名空间内删除工作流定义

    DELETE /v2/workflows/<workflow id>?namespace=<namespace>
    
  • 在命名空间内获取工作流定义

    GET /v2/workflows/<workflow id>?namespace=<namespace>
    
  • 获取给定命名空间内的所有工作流定义

    GET /v2/workflows?namespace=<namespace>
    
  • 更新给定命名空间内的工作流定义

    PUT /v2/workflows?namespace=<namespace>
    
    <Workflow YAML text>
    
  • 创建属于非默认命名空间的工作流的执行

    POST /v2/executions
    
    {
      "workflow_name": "<workflow id or name>",
      "workflow_namespace": "<namespace>",
      ...
    }
    

解析工作流定义

了解 Mistral 在运行工作流时如何考虑命名空间解析工作流定义,以及工作流层次结构中的命名空间如何工作非常重要。

规则如下

  • 如果用户通过 API(或 CLI)启动工作流,则明确提供了工作流名称和相应的命名空间,因此 Mistral 将在提供的命名空间下查找具有给定名称的工作流定义。如果未指定命名空间,则将使用默认命名空间(空命名空间值)。如果 Mistral 未找到具有给定名称和命名空间的工作流定义,它将返回错误响应。

  • 如果工作流作为子工作流启动,即它在不同工作流中具有父任务,则 Mistral 使用父工作流的命名空间来解析工作流定义。换句话说,Mistral 将命名空间传播到其子工作流。但是,如果工作流定义不存在于父工作流的命名空间中,则 Mistral 将尝试在默认命名空间中找到它。 这与通过 API 启动工作流的情况不同,Mistral 会返回错误,而不是尝试在默认命名空间中查找工作流定义。

  • 作为工作簿一部分声明的工作流始终位于默认命名空间中。

为了说明所有这些工作原理,让我们看一下以下工作流定义

---
version: '2.0'

wf1:
  tasks:
    t1:
      workflow: wf2
---
version: '2.0'

wf2:
  tasks:
    t2:
      workflow: wf3
---
version: '2.0'

wf3:
  tasks:
    t3:
      action: std.noop
---
version: '2.0'

wf3:
  tasks:
    should_not_run:
      action: std.fail

因此,调用链如下所示

wf1 -> wf2 -> wf3

但是,请注意,我们有两个名为“wf3”的工作流。

假设这些工作流定义上传到 Mistral 的命名空间如下

ID

name

namespace

1

wf1

abc

2

wf2

3

wf3

abc

4

wf3

然后我们通过 API 创建一个工作流执行,如下所示

POST /v2/executions

{
  "workflow_name": "wf1",
  "workflow_namespace": "abc"
}

在这种情况下,Mistral 将

  • 在命名空间“abc”中找到“wf1”(它反正不在默认命名空间中)

  • 尝试在命名空间“abc”中找到“wf2”,由于它不存在,Mistral 将在默认命名空间中找到它

  • 因为它是从“wf1”传播过来的,所以在命名空间“abc”中找到“wf3”

但是,如果我们像这样启动一个工作流

POST /v2/executions

{
  "workflow_name": "wf2"
}

我们将获得调用链

wf2 -> wf3

因为未向端点提供非默认命名空间,所以两个工作流定义都将从默认命名空间获取。