将多个场景串联起来
您可以将方案链接在一起,允许一个方案触发另一个方案,并将第二个方案的数据输出返回到第一个方案。 这允许创建更多模块化方案,您无需在多个方案中复制方案部分。
您可以从一个父方案调用多个子方案,也可以从多个父方案调用一个子方案。 也可以嵌套子场景,从另一个场景调用一个场景。
当父方案等待子方案返回数据时,该时间不计入父方案的超时。 例如,父方案会调用5个子方案,每个子方案需要10分钟才能运行,总共运行50分钟。 父方案本身中的模块需要15分钟才能运行。 即使已过65分钟(已超过40分钟的超时限制),父方案也不会超时。
有关Fusion性能护栏(包括超时)的详细信息,请参阅Fusion性能护栏。
有关配置链模块的说明,请参阅链模块。
父方案和子方案
- 父项方案调用另一个方案,使用链 > 调用子方案模块。 它接收子方案的输出,可在后续方案模块中处理。
- 子方案由父方案调用。 其触发模块接收来自父方案的数据,并将输出返回到父方案。
父方案需要来自子方案的响应。 当前不支持不返回数据的子方案。
链接方案中的数据结构
Workfront Fusion使用数据结构将信息从父方案传输到子方案。 数据结构在子方案中配置。 从父方案中选择子方案时,用作子方案输入的数据结构的字段将显示在父方案中。 您可以将值映射到这些字段,这些字段在触发时传递到子方案。
有关要在父方案和子方案中配置的模块的信息,请参阅链模块。
有关数据结构的信息,请参阅数据结构。
数据流
- 数据通过父方案流动。
- 数据到达调用子方案模块。 数据被映射到调用子方案模块中的字段,这些字段与子方案的触发器模块中使用的数据结构中的字段匹配。
- 调用子方案中的数据将传递到子方案。
- 子方案处理数据并执行操作。
- 子方案以返回至父模块的响应结束。
- 将返回响应输出到父模块传递给父方案。
- “调用子项”方案的输出是子方案的输出。 此输出稍后可在父场景中处理。
用例
考虑以下链接方案的示例用例:
-
可重复使用的逻辑:您可以为跨多个方案使用的重复操作链接方案。 例如,如果您有多个存档内容的方案,则可以创建一个名为“存档内容”的单个子方案,然后可以将其用作任何存档内容的工作流的子方案。
-
错误处理:组织通常在多个场景中具有相同的错误处理操作,例如将错误日志发送到数据存储并创建Slack通知的错误处理路由。 您可以使用这些操作创建一个子方案,并在多个方案中的错误处理路由时链接该方案。
-
扩展时间:对于总处理时间将超过单个方案40分钟执行限制的大型批处理操作,可以使用链接。 但是,请谨慎处理此模式:链接到多个长期运行的子方案的父方案没有总体超时边界。 如果有任何子方案挂起或发生平台问题,则父方案会无限期等待而不会显示错误。
在使用链接来延长执行时间之前,请考虑是否可以减小批次大小、增加频率还是重新设计以避免长顺序链接。 请参阅下面的最佳实践。
-
替换迭代器将迭代器替换为子方案可以减少内存使用量,例如,在导致内存不足错误的迭代中执行复杂操作。 您可以为复杂操作创建单独的方案,并将迭代器替换为调用子方案模块
-
搜索并创建记录:例如,您可以创建搜索用户的方案。 如果存在,则架构会将这些受众添加为具有审核和批准权限的批准者。 如果它们不存在,则场景会创建请求管理员载入新用户。
查看链接方案的执行历史记录
您可以通过查看链中包含的每个方案的历史记录来查看链接方案的执行历史记录。 例如,父场景的执行历史记录将包含有关直接在父场景中处理的模块和数据的信息。 要查看子方案中处理的模块和数据的执行历史记录,请打开子方案并在其中查看执行历史记录。
我们建议使用“调用子方案”模块中的 转到子方案 按钮来快速转到子方案,您可以在其中查看其执行历史记录。 子方案将在另一个浏览器窗口中打开,允许您同时查看父方案和子方案。
错误和未完成执行
错误处理
如果子方案出错,这可能会影响将数据取回给父方案。
我们建议在子方案中配置错误处理,以确保如果子方案中出现问题,父方案不会卡在等待子方案的响应。
最佳实践
链接场景时,请考虑以下最佳实践。
链接场景时避免出现递归
递归指场景触发自身的新一次执行,而该执行又会触发新的执行,形成无限循环。
递归可能会对拥有该递归场景的组织以及其他组织造成性能问题。
链接场景时,请遵循以下操作以避免递归:
- 确保子方案无法触发父方案。 例如,如果在创建请求时触发了父方案,请确保子方案不会创建请求。
- 确保子方案不相互调用。 例如,如果子方案A调用子方案B,请确保子方案B不调用子方案A。
- 确保方案不能调用自身。 例如,当创建任务时触发一个场景,而该场景则会创建两个任务。 新创建的两个任务又会再次触发该场景,从而创建四个新任务。 每次创建任务都会触发场景,而每次场景运行时,任务数量都会加倍。 任务数量会呈指数级增长。
- 如果某个场景导致递归,Fusion 工程团队会将其停用,以防止进一步出现性能问题。
- 由于递归是由场景设计方式所导致的,因此在设计场景时,必须确保场景中不包含会再次触发该场景的操作。
- 您可以查看父方案与子方案之间的关系图。
有关说明,请参阅查看链接方案关系。
使用错误处理以确保响应
由于父方案正在等待子方案的响应才可以继续,因此您必须确保已构建子方案,以便在遇到错误时提供响应。
不要使用“最后提交触发器(CTL)”设置
我们不建议将方案设置“最后提交触发器(CTL)”与链接方案一起使用。 如果需要对使用链接的方案执行重试行为,请使用具有定义的最大重试计数的错误处理路由显式实现它。
限制嵌套深度
将链接方案网络限制为两个深度级别(父→子)。 嵌套了三个或更深级别(父级→子级→孙级)的场景会显着增加复杂性,降低可观察性,并且使得在没有工程支持的情况下诊断故障变得困难。
如果您的设计需要更深入的嵌套,请记录完整的链图,并确保在部署到生产环境之前进行监控。
用火,小心忘记
在调用子方案模块中启用 Fire and Forge 后,父方案将调度子方案并立即继续执行,而无需等待响应。 父级无法查看子方案是运行、成功还是失败。
仅在以下情况下使用Fire and Force :
- 子方案执行不会影响父方案逻辑的日志记录、通知或审计写入
- 您有独立的监视功能来检测无提示子故障
切勿使用Fire ,并忘记以下情况:
- 子方案执行父方案所依赖的写入
- 在父方案继续之前,您需要知道子方案是否成功
- 工作流是事务性的,或需要一次性处理保证
避免在迭代器中高容量调用子方案
将“调用子方案”模块放置在BasicFeeder或其他迭代器中,会为处理的每个项目调度子方案。 在项目数量较多时(每次运行数百个或更多),这会产生大量的调度开销,并增加暴露于平台可靠性问题的风险。
使用此模式之前:
- 考虑子方案的逻辑能否作为模块直接内联到父方案
- 预先计算为迭代器之外的每个迭代返回相同值的任何查找,而不是为每个项分派链调用
- 在部署到生产环境之前,请确认实际的最大项目数,并与管理员一起审查