点击上方蓝字关注我们
IT 咖啡馆,探索无限可能!
恭喜你发现了这个宝藏,这里你会发现优质的开源项目、IT知识和有趣的内容。
在企业级的工作中总会有很多的复杂任务,这个时候一般就会将他们设计成各种不同的工作流。
今天我们分享一个开源项目,它由Netflix开源一周就收获超2000star,为 Netflix 的数据平台用户提供完全托管的工作流即服务,它就是:Maestro
Maestro 是什么
Maestro 是一个通用工作流程编排器,它是Netflix在本周刚刚开源的一个项目,它为 Netflix 的数据平台用户提供完全托管的工作流即服务 (WAAS)。
Maestro 是一种通用的、可水平扩展的工作流编排器,旨在管理大规模工作流,例如数据管道和机器学习模型训练管道。它监督工作流的整个生命周期,从开始到结束,包括重试、排队、将任务分配给计算引擎等。用户可以将其业务逻辑打包成各种格式,例如 Docker 镜像、笔记本、bash 脚本、SQL、Python 等。与仅支持有向无环图 (DAG) 的传统工作流编排器不同,Maestro 支持无环和有环工作流,还包括多种可重用模式,包括 foreach 循环、子工作流和条件分支等。
工作流编排中的挑战
可扩展性
可扩展性
编排器必须每天调度数十万个工作流、数百万个作业,并且即使在流量激增时也要严格遵守 SLO,即调度器引入的延迟不得超过 1 分钟。在 Netflix,峰值流量负载可能比平均负载高出几个数量级。例如,我们的许多工作流都在 UTC 午夜左右运行。因此,系统必须承受流量激增,同时仍保持 SLO 要求。此外,出于操作和可用性原因,我们希望有一个单一的调度器集群来管理大多数用户工作流。
需要考虑的可扩展性的另一个维度是工作流的大小。在数据领域,单个工作流中通常有大量作业。例如,过去五年每小时补填数据的工作流可能导致 43800 个作业(24 * 365 * 5),每个作业处理一小时的数据。同样,ML 模型训练工作流通常由单个工作流中的数万个(甚至数百万个)训练作业组成。这些大规模工作流可能会创建热点并压垮编排器和下游系统。因此,编排器必须以高效的方式管理由数十万个作业组成的工作流,这也非常具有挑战性。
可用性
可用性
Netflix 是一家数据驱动型公司,从着陆页使用的像素颜色到电视剧的续订,关键决策都由数据洞察驱动。数据科学家、工程师、非工程师,甚至内容制作人都在运行他们的数据管道来获取必要的洞察。鉴于背景多样化,可用性是 Netflix 成功协调者的基础。
我们希望用户专注于他们的业务逻辑,让编排器解决诸如调度、处理、错误处理、安全等交叉问题。它需要提供不同粒度的抽象来解决类似的问题,高级抽象用于满足非工程师的需求,低级抽象用于帮助工程师解决他们自己的特定问题。它还应提供所有旋钮来配置他们的工作流程以满足他们的需求。此外,系统必须可调试,并显示所有错误以供用户排除故障,因为它们可以改善用户体验并减轻运营负担。
工作流定义
Maestro 工作流定义包含两个主要部分:属性和版本化工作流(包括其元数据)。属性包括作者和所有者信息以及执行设置。版本化工作流包括诸如唯一标识符、名称、描述、标签、超时设置和关键性级别(低、中、高)等属性,用于确定优先级。每次工作流更改都会创建一个新版本,从而实现跟踪和轻松恢复,默认情况下使用活动版本或最新版本。工作流由步骤组成,这些步骤是用户定义的工作流图中的节点。步骤可以表示作业、使用子工作流步骤的另一个工作流或使用 foreach 步骤的循环。步骤由唯一标识符、步骤类型、标签、输入和输出步骤参数、步骤依赖关系、重试策略和故障模式、步骤输出等组成。Maestro 支持基于错误类型的可配置重试策略,以增强步骤弹性。
工作流运行策略
Maestro 使用预定义的运行策略来决定工作流实例是否应该运行。Maestro支持的运行策略包括了以下几种:
顺序运行策略:这是 maestro 使用的默认策略,它根据先进先出 (FIFO) 顺序一次运行一个工作流。使用此运行策略,Maestro 按照触发的顺序运行工作流。请注意,执行不依赖于先前的状态。一旦工作流实例达到其中一个终端状态,无论成功与否,Maestro 都会启动队列中的下一个工作流。
严格顺序运行策略:使用此运行策略,Maestro 将按触发顺序运行工作流,但如果工作流实例历史记录中出现阻塞错误,则会阻止执行。新触发的工作流实例将排队,直到通过手动重新启动失败的实例或将失败的实例标记为未阻塞来解决错误。
仅第一个运行策略
仅最后一个运行策略
并行并发限制运行策略
工作流执行模式
Maestro 提供了多个有用的构建块,使用户可以轻松定义数据流模式或其他工作流模式。接下来,我们将讨论 Maestro 提供的三个主要构建块。
Foreach 支持
在 Maestro 中,foreach 模式被建模为原始工作流定义中的专用步骤。foreach 循环的每次迭代在内部被视为一个单独的工作流实例,该实例的扩展方式与任何其他 Maestro 工作流类似,基于在 foreach 定义块中定义的步骤执行(即子图)。foreach 步骤中的子图的执行被委托给单独的工作流实例。然后,Foreach 步骤监视并收集这些 foreach 工作流实例的状态,每个实例管理单个迭代的执行。
条件分支支持
条件分支功能允许仅在满足上游步骤中的特定条件时运行后续步骤。这些条件使用 SEL 表达式语言定义,并在运行时进行评估。结合其他构建块,用户可以构建强大的工作流程,例如,如果审计检查步骤失败,则进行一些补救,然后再次运行该作业。
子工作流支持
子工作流功能允许工作流步骤运行另一个工作流,从而实现跨多个工作流共享常用功能。这有效地实现了“工作流即功能”,并允许用户构建工作流图。例如,我们观察到复杂的工作流由数百个子工作流组成,用于处理数百个表中的数据,其中子工作流由多个团队提供。
这些模式可以组合在一起,为复杂的工作流用例构建复合模式。例如,我们可以循环遍历一组子工作流或运行嵌套的 foreach 循环。Maestro 用户开发的一个例子是自动恢复工作流,它利用条件分支和子工作流功能来处理错误并自动重试作业。
安装运行
准备
Git
Java 21
Gradle
Docker
构建
./gradlew build
运行
./gradlew bootRun
创建一个workflow
curl --header "user: tester" -X POST '<http://127.0.0.1:8080/api/v3/workflows>' -H "Content-Type: application/json" -d @maestro-server/src/test/resources/samples/sample-dag-test-1.json
总结
Netflix的项目一项都有着非常不错的品质,之前Netflix的一些项目也是为Java的微服务化打下了基础,这次通过Maestro,他们正在将工作流编排提升到新的水平,并不断解决新的问题和挑战。如果你也关注工作流编排的内容,那不妨对这个项目进行深入的研究和尝试。
项目信息
项目名称:mem0
GitHub 链接:https://github.com/mem0ai/mem0
Star 数:15K