Dagu vs Prefect
如果你想要编排但不想写 Python,可以看看 Dagu。
Prefect 是面向用代码编写 flow 的数据团队的 Python framework。Dagu 是一个单一二进制,用声明式 YAML 调用你已有的命令,没有需要运维的数据库。本页诚实地看看两者各自适合什么。
name: nightly-ops
schedule: "0 2 * * *"
steps:
- id: extract
run: python scripts/extract.py
- id: transform
run: ./bin/transform
retry_policy:
limit: 3
depends: [extract]
- id: notify
run: ./scripts/slack-success.sh
depends: [transform]工作流是声明式 YAML,而非 Python 代码
基于文件状态的单一二进制
无需外部数据库或消息代理
面向 shell、Docker、HTTP、SSH、SQL、子工作流和 AI Agent 步骤的 executor
At a glance
Dagu vs Prefect 一览
调用命令的声明式 YAML。
带 @flow 和 @task decorator 的 Python 函数。
基于文件状态的单一二进制。
Prefect server 加数据库,外加独立的 workers。
想要小型自托管运行时的脚本、容器和运维自动化。
想要动态 flow 和可选托管云的、以 Python 为中心的数据团队。
In depth
Where each tool fits
用声明式 YAML 而非 Python framework
Prefect 把任务建模为用 @flow 和 @task decorator 包装的 Python 函数,工作流因此存在于你的代码库里。Dagu 让每个步骤保持为命令,并在外面用 YAML 包上调度、重试和依赖关系。
- 定义运行 shell、Docker、HTTP、SSH、SQL 或子工作流的步骤
- 让不写 Python 的运维人员也能读懂工作流
- 把 YAML 与它调用的脚本一起放进 git 管理
基于文件状态的单一二进制
生产环境的 Prefect 会运行一个由 Postgres 等数据库支撑的 Prefect server,以及执行 flow 的 workers。Dagu 以单一二进制发布,把运行历史、日志和队列状态保存在本地文件系统上。
- 下载一个文件即可开始,无需准备数据库
- 通过处理文件和一个二进制来备份和升级
- 需要时从本地运行扩展到队列或分布式 workers
何时应改选 Prefect
当你的工作流属于 Python,且团队也乐于运维它的各项服务时,Prefect 更合适。有些需求比起 Dagu 更自然地落在 Prefect 上。
- 你想要在运行时由 Python 决定形状的动态 DAG
- 你的流水线在任务间传递 Python 对象,而不是调用命令
- 你想要托管选项,Prefect 通过 Prefect Cloud 提供
FAQ
Practical questions before adopting Dagu
Dagu 能替代 Prefect 吗?
并非对每个团队都是。如果你的工作流是 Python,并依赖动态 flow 或在任务间传递 Python 对象,Prefect 更合适。当工作以命令、容器或服务调用存在,且你想要 YAML 和无数据库时,Dagu 更合适。
不写任何 Python 也能用 Dagu 吗?
可以。Dagu 工作流是调用命令的 YAML。某个步骤可以运行你已有的 Python 脚本,但编排层本身不需要 Python,也不需要 framework import。
与 Prefect 相比,Dagu 需要什么基础设施?
Dagu 的状态基于文件,所以只需一个二进制和文件系统。典型的 Prefect 部署会运行带数据库的 server 和一个或多个 workers。Dagu 没有托管云,需要你自托管。
Next step
Start with one workflow.
Install Dagu, move one fragile script or agent task into YAML, and decide from a real run history.