Prefect 是一个现代化的、开源的工作流编排与任务自动化框架,专为数据工程、机器学习运维(MLOps)和复杂异步/分布式任务编排而设计

📅 2026/7/17 5:23:36 ✍️ 编辑团队 👁️ 阅读次数
Prefect 是一个现代化的、开源的工作流编排与任务自动化框架,专为数据工程、机器学习运维(MLOps)和复杂异步/分布式任务编排而设计
Prefect 是一个现代化的、开源的工作流编排与任务自动化框架专为数据工程、机器学习运维MLOps和复杂异步/分布式任务编排而设计。相比传统工具如 Apache AirflowPrefect 强调开发者体验、动态工作流、原生异步支持、类型安全、可测试性与可观测性。核心特性包括✅声明式 命令式混合编程模型支持用 Python 函数直接定义任务task工作流Flow可动态构建如基于条件或运行时数据生成分支✅原生异步支持task和flow均可标记为async无缝集成asyncio适合 I/O 密集型任务如 API 调用、数据库查询、文件上传✅状态驱动执行引擎任务状态Pending → Running → Success/Failed → Retrying全程可追踪支持自动重试、超时、依赖回滚viaretry_policy/timeout_seconds✅弹性执行后端本地运行process/thread、分布式调度Prefect Server 或云托管的 Prefect Cloud支持 Kubernetes、Docker、AWS Lambda 等执行环境✅实时可观测性内置 UIPrefect Orion / Prefect 2.x 的自托管服务器提供任务日志、状态图谱、运行历史、告警集成Slack/Webhook✅参数化与版本化Flow 可接受运行时参数且代码变更自动触发新版本部署配合prefect deployCLI✅强大依赖管理支持任务间显式数据传递非仅 DAG 依赖、缓存cache_key_fn、边缘触发wait_for、失败跳过skip_on_upstream_skipTrue等高级编排逻辑。典型使用示例Prefect 2.xfromprefectimportflow,taskimportasynciotaskasyncdeffetch_data(url:str)-str:awaitasyncio.sleep(1)# 模拟异步请求returnfData from{url}taskdefprocess(data:str)-int:returnlen(data)flowasyncdefdata_pipeline():rawawaitfetch_data(https://api.example.com)lengthprocess(raw)print(fProcessed length:{length})returnlength# 运行if__name____main__:asyncio.run(data_pipeline())部署到 Prefect Serverprefect deployment build ./pipeline.py:data_pipeline-nprod-deploy--cron0 * * * *prefect deployment apply data_pipeline-deployment.yaml prefect agent start-qdefault⚠️ 注意Prefect 1.x基于 Airflow 风格已停止维护推荐全面迁移到Prefect 2.xOrion 架构。在 Prefect 2.x 中任务task和流程flow均支持声明式重试策略包括固定次数重试、指数退避exponential backoff和自定义重试条件。核心机制通过retry_policy参数配置底层基于RetryPolicy类Prefect v2.10 推荐使用retry_policy旧版retries/retry_delay_seconds已弃用。✅推荐方式使用RetryPolicy启用指数退避fromprefectimporttask,flowfromprefect.retryersimportExponentialBackoffimportasyncioimportrandomtask(retry_policyExponentialBackoff(max_retries3,# 最多重试 3 次即最多执行 4 次1次初始 3次重试jitter_factor0.2,# 添加随机抖动0–0.2×base_delay防雪崩base_delay_seconds1.0,# 初始延迟 1s → 2s → 4s → 8s指数增长))defflaky_task():ifrandom.random()0.7:# 70% 概率失败raiseRuntimeError(Simulated transient failure)returnsuccess!flowdefmain_flow():resultflaky_task()returnresult# 运行时将自动按指数退避重试如失败则等待 ~1s → ~2s → ~4sif__name____main__:main_flow() 关键说明ExponentialBackoff是 Prefect 内置的重试策略类位于prefect.retryers自动计算每次重试的延迟base_delay * 2^attempt_number 抖动jitter_factor默认0.2引入随机偏移如base_delay1第1次重试延迟为1.0 ± 0.2秒避免大量任务同步重试max_retries3表示最多重试 3 次即总尝试次数 4若全部失败则最终状态为Failed重试仅对可重入的瞬态错误有效如网络超时、临时 API 拒绝不适用于逻辑错误如ValueError——可通过retry_condition_fn精确控制重试触发条件task(retry_policyExponentialBackoff(max_retries2),retry_condition_fnlambdaexc:isinstance(exc,(ConnectionError,TimeoutError)))defresilient_api_call():...⚠️ 注意事项Flow 层也可配置retry_policy但通常建议在任务粒度控制重试更精准重试期间任务状态为RetryingUI 和日志中清晰可见每次尝试的Run ID和延迟若使用prefect deploy部署到服务器重试策略随代码持久化无需额外配置。