
Apache DolphinScheduler 8 月月报来啦!过去一个月,社区持续推进项目迭代,在功能优化、性能提升和生态建设等方面不断取得新进展。让我们一起看看 8 月 DolphinScheduler 又有哪些值得关注的更新,也感谢每一位参与贡献、积极反馈和支持社区的小伙伴,正是大家的共同努力,让 DolphinScheduler 持续成长!
📊 本月数据速览
| 指标 | 数值 |
|---|---|
| 🚀 合并 PR 总数 | 23 |
| 👥 贡献者人数 | 10 |
| ➕ 新增代码行 | +3,702 |
| ➖ 删除代码行 | -1,327 |
| 🔀 净变更行数 | +2,375 |
| 📁 触达模块数 | 8 |
| 📝 文档文件触达数 | 5 |
| 🧪 测试文件触达数 | 28 |
🏆 贡献者排名
| 排名 | GitHub 用户名 | 主要贡献方向 | PR 数 | +Lines | -Lines | 综合得分 |
|---|---|---|---|---|---|---|
| 🥇 | @ruanwenjun | 测试用例 / Tests | 10 | 1602 | 1001 | 88.59 |
| 🥈 | @njnu-seafish | 性能优化 / Performance | 3 | 818 | 288 | 29.09 |
| 🥉 | @SEPURI-SAI-KRISHNA | 问题定位与修复 / Debug & Fix | 2 | 229 | 3 | 18.77 |
| 4. | @kittimzhe | 文档完善 / Documentation | 2 | 4 | 4 | 14.02 |
| 5. | @nikhiln64 | 问题定位与修复 / Debug & Fix | 1 | 344 | 8 | 10.16 |
| 6. | @hellodml | 问题定位与修复 / Debug & Fix | 1 | 136 | 1 | 9.45 |
| 7. | @zhang-arvin | 问题定位与修复 / Debug & Fix | 1 | 10 | 3 | 9.04 |
| 8. | @liang-wenjie | 测试用例 / Tests | 1 | 542 | 7 | 7.82 |
| 9. | @hiSandog | 测试用例 / Tests | 1 | 17 | 1 | 6.06 |
| 10. | @SbloodyS | 架构与工程化 / Architecture | 1 | 0 | 11 | 6.01 |
🔄 代码变更
按维度分布(功能特性 / 性能优化 / Bug 修复 / 架构改进)
| 维度 | PR 数 | 占比 |
|---|---|---|
| 功能特性 | 6 | 26.1% |
| 性能优化 | 2 | 8.7% |
| Bug 修复 | 9 | 39.1% |
| 架构改进 | 6 | 26.1% |
本月 Bug 修复(39.1%,9 项) 占比最高,叠加 6 项功能特性和 2 项性能优化,整体呈现「稳定性优先 + 稳步迭代新特性」的节奏。
📦 主要涉及模块
按 PR 触达次数排序。
| 排名 | 模块 | PR 触达 | 新增行 | 删除行 | 净变更 |
|---|---|---|---|---|---|
| 1. | dolphinscheduler-api | 82 | +2,132 | -1,016 | +1,116 |
| 2. | dolphinscheduler-dao | 25 | +307 | -201 | +106 |
| 3. | docs | 14 | +68 | -48 | +20 |
| 4. | dolphinscheduler-ui | 10 | +74 | -27 | +47 |
| 5. | dolphinscheduler-master | 9 | +374 | -12 | +362 |
| 6. | dolphinscheduler-common | 6 | +64 | -6 | +58 |
| 7. | dolphinscheduler-scheduler-plugin | 6 | +229 | -4 | +225 |
| 8. | dolphinscheduler-task-plugin | 4 | +305 | -2 | +303 |
| 9. | misc | 3 | +149 | -11 | +138 |
模块洞察:
- 🏛️ API 层(15次) 是本月绝对的改动重心,15/23 的 PR 都涉及 API 模块——主要集中在权限/授权加固和过时接口清理
- 🏗️ DAO 层(7次) 主要配合 API 层做查询优化(大字段排除)和权限查询逻辑改造
- 🎨 UI 模块(5次) 虽触达不少,但以小改动为主(+49 净行),属配套型调整
- 🔧 Master(4次) 聚焦任务重试、故障恢复等调度核心稳定性
🎯 对用户最有感的 8 件事
从「用户感知度」角度筛选本月最重要的变更,按影响面排序。
一. 🔐 权限/安全增强(7 项 PR)
代表性 PR:#18561 - [Fix-18559][API] Align workflow mutations with project write permissions (#18561)
- 作者:@ruanwenjun
- 变更规模:+426 / -128 行
- 本月同类 PR 数:7 项
用户价值:多租户隔离更严格,敏感操作更安全,合规性更强。本月连续 7 个 PR 围绕权限体系打补丁(项目写权限对齐、子工作流跨项目鉴权、数据源/集群授权校验、Actuator端点鉴权、用户列表脱敏、授权列表接口优化),是企业多租户场景的核心收益点。
重点关注场景:
- ✅ 工作流变更(创建/更新/删除)是否严格校验项目级 write 权限
- ✅ 子工作流引用时,是否能校验「被引用工作流」的访问权限(防止越权)
- ✅ 任务定义关联数据源时,是否校验当前用户对该数据源的访问权限
- ✅ 集群查询 API 是否有一致性的权限校验
- ✅ 用户列表接口是否脱敏 + 权限收敛
- ✅ Actuator 敏感端点是否需要认证才能访问
同类 PR 完整列表
| PR # | 标题 | 作者 | Diff |
|---|---|---|---|
| #18561 | [Fix-18559][API] Align workflow mutations with project write permissions (#18561) | @ruanwenjun | +426/-128 |
| #18597 | [Fix-18596][API] Enforce permission checks for sub-workflow references (#18597) | @ruanwenjun | +450/-0 |
| #18566 | [Fix-18565][API] Validate datasource access for task definitions (#18566) | @ruanwenjun | +342/-17 |
| #18564 | [Improvement-18563][API] Refine datasource authorization list APIs (#18564) | @ruanwenjun | +102/-62 |
| #18583 | [Fix-18582][Authentication] Align actuator endpoint matching (#18583) | @ruanwenjun | +149/-11 |
| #18560 | [Improvement-18558][API] Harden user list access and responses (#18560) | @ruanwenjun | +65/-28 |
| #18590 | [Improvement-18589][API] Align cluster query permissions (#18590) | @ruanwenjun | +59/-20 |
二. 🛡️ 稳定性/Bug修复(4 项 PR)
代表性 PR:#18573 - [Fix-18570][Master] Detect wrapped CommandDuplicateHandleException in bootstrapError (#18570) (#18573)
- 作者:@hellodml
- 变更规模:+136 / -1 行
- 本月同类 PR 数:4 项
用户价值:修复工作流/任务的异常状态问题,直接提升生产可靠性。维度维度上 Bug 修复 PR 共 9 项(本月主线),其余 Bug 类 PR 已归入「权限/K8S/DataX/文档」等专项小节,此处列出非专项的 4 项核心 Bug 修复。
重点关注场景:
- ✅ 失败任务重试:任务失败后重新创建实例时,运行时状态是否正确 reset(避免脏状态导致重试异常)
- ✅ 重试时机计算:任务重试调度时间是否按
endTime + retryInterval计算,而非 startTime - ✅ Master 启动异常:
CommandDuplicateHandleException被包装后能否被 bootstrapError 正确识别 - ✅ 日志消息拼写:DataSourceServiceImpl 日志是否正确(避免排查时被误导)
同类 PR 完整列表
| PR # | 标题 | 作者 | Diff |
|---|---|---|---|
| #18573 | [Fix-18570][Master] Detect wrapped CommandDuplicateHandleException in bootstrapError (#18570) (#18573) | @hellodml | +136/-1 |
| #18541 | [Fix-18540][Master] Reset the runtime state when recreating a failed task instance (#18541) | @SEPURI-SAI-KRISHNA | +132/-0 |
| #18539 | [Fix-18538][Master] Schedule task retry at endTime + retryInterval (#18539) | @SEPURI-SAI-KRISHNA | +97/-3 |
| #18581 | [Improvement-18580][api] Fix typo in DataSourceServiceImpl log message (#18581) | @kittimzhe | +1/-1 |
三. ⏰ 调度策略/补火(1 项 PR)
代表性 PR:#18464 - [DSIP-18454][Scheduler] Add schedule missed fire policy (#18464)
- 作者:@liang-wenjie
- 变更规模:+542 / -7 行
- 本月同类 PR 数:1 项
| 策略 | 行为 | 适用场景 |
|---|---|---|
| Skip | 跳过错过的触发,等待下一次 cron | 错过即错过,不希望补跑冲击系统 |
| FireOnceNow | 只补一次(立即执行),其余错过的丢弃 | 只要补最近一次的业务 |
| FireAll | 把所有错过的触发全部补齐(按原计划时间依次触发) | 金融/对账场景,必须每次都跑 |
用户价值:这是本月最大的新特性!当 Master 停机或调度线程阻塞导致错过 cron 触发时,现在可以配置 3 种策略应对「补火」场景。
重点关注场景:
- ✅ 新建/编辑调度时,UI 上能否看到「Missed Fire Policy」下拉选项
- ✅ 模拟 Master 停机 2 小时(停掉 Master 进程再拉起),观察不同策略下的行为是否符合预期
- ✅ 数据库升级脚本(
3.5.0_schema)是否正确执行,t_ds_schedule表新增字段是否存在
四. ⚡ 性能优化(2 项 PR)
代表性 PR:#18444 - [Improvement-18443][API&DAO] Optimize WorkflowInstanceMapper to exclude large text fields from list queries (#18444)
- 作者:@njnu-seafish
- 变更规模:+790 / -268 行
- 本月同类 PR 数:2 项
用户价值:工作流实例/任务实例列表查询时,不再把 global_params、process_instance_json 等大 TEXT 字段一起查出来。列表页响应速度、数据库 IO、内存占用都会有明显改善,大规模部署场景收益突出。
重点关注场景:
- ✅ 工作流实例列表页分页查询响应时间(1000+ 实例时对比优化前后)
- ✅ 打开单个工作流实例详情页,全局参数等大字段是否正常展示(详情接口还是会查)
- ✅ 列表页导出/搜索等功能是否正常不受影响
同类 PR 完整列表
| PR # | 标题 | 作者 | Diff |
|---|---|---|---|
| #18444 | [Improvement-18443][API&DAO] Optimize WorkflowInstanceMapper to exclude large text fields from list queries (#18444) | @njnu-seafish | +790/-268 |
| #18442 | [Improvement-18441][API&DAO] Optimize TaskInstanceMapper to exclude large text fields from list queries (#18442) | @njnu-seafish | +17/-5 |
五. 🔌 任务类型/新数据源(1 项 PR)
代表性 PR:#18434 - [Fix-18389][DataX] Read job definition from attached resource file when custom json is empty (#18434)
- 作者:@nikhiln64
- 变更规模:+344 / -8 行
- 本月同类 PR 数:1 项
用户价值:DataX 用户之前必须把 JSON 内容粘贴到 UI 的自定义 JSON 框里,且无法复用资源中心的文件。现在支持「自定义 JSON 为空时,自动从资源文件读取」,与 SQL 任务从资源文件读 SQL 逻辑一致,体验更统一。
六. 🧹 API清理/工程化(5 项 PR)
代表性 PR:#18569 - [Improvement-18568][API] Remove obsolete task update-with-upstream API (#18569)
- 作者:@ruanwenjun
- 变更规模:+2 / -507 行
- 本月同类 PR 数:5 项
用户价值:本月集中清理了 3 组过时 API(cluster query-by-code、task update-with-upstream、dynamic sub-workflow 相关),并同步更新了 incompatible.md。对升级用户来说需重点关注——如果你们有自研前端或自动化脚本用到了这些老 API,需要提前做适配。
同类 PR 完整列表
| PR # | 标题 | 作者 | Diff |
|---|---|---|---|
| #18569 | [Improvement-18568][API] Remove obsolete task update-with-upstream API (#18569) | @ruanwenjun | +2/-507 |
| #18557 | [Improvement-18556][API] Remove obsolete dynamic sub-workflow API (#18557) | @ruanwenjun | +2/-138 |
| #18584 | [Chore][API] Remove obsolete cluster query-by-code API (#18584) | @ruanwenjun | +5/-90 |
| #18408 | [Chore][Common] Handle parentless paths in FileUtils (#18408) | @hiSandog | +17/-1 |
| #18599 | [Chore] Remove unused code- #18599 (#18599) | @SbloodyS | +0/-11 |
七. ☸️ K8S/云原生部署(1 项 PR)
代表性 PR:#18574 - [Fix-17883] Fix K8s Alert HTTP test sending failed by using IP for non-StatefulSet pods (#17883) (#18574)
- 作者:@zhang-arvin
- 变更规模:+10 / -3 行
- 本月同类 PR 数:1 项
用户价值:K8S 非 StatefulSet Pod(如 Deployment 模式)下,告警 HTTP 实例测试之前因按 hostname 寻址失败,修复后改用 IP 寻址,K8S 部署的告警通道可靠性提升。
八. 📚 文档/示例改进(2 项 PR)
代表性 PR:#18478 - [Doc-18474][Upgrade] Fix zh/en incompatible upgrade docs out of sync (#18478)
- 作者:@njnu-seafish
- 变更规模:+11 / -15 行
- 本月同类 PR 数:2 项
用户价值:修复了数据源文档和配置文档中的坏链接,同时中英文升级不兼容变更文档重新对齐,减少文档误导带来的踩坑。
同类 PR 完整列表
| PR # | 标题 | 作者 | Diff |
|---|---|---|---|
| #18478 | [Doc-18474][Upgrade] Fix zh/en incompatible upgrade docs out of sync (#18478) | @njnu-seafish | +11/-15 |
| #18578 | [Doc-18579] Fix malformed links in datasource and configuration docs (#18578) | @kittimzhe | +3/-3 |
⚠️ 升级与验证建议
风险等级评估
总体风险等级:🟠 中高风险
| 风险维度 | 评估 | 说明 |
|---|---|---|
| 核心模块变更 | ⚠️ 是 | API 模块 15/23 触达,需重点回归权限相关接口 |
| Bug 修复数量 | 9 项 | Bug修复较多,建议关注任务重试/失败恢复场景 |
| 权限/安全变更 | 7 项 | ⚠️ 权限模型有较大变动,需全面验证鉴权逻辑 |
| K8S/部署变更 | 1 项 | ⚠️ 涉及部署脚本,需验证Helm/Docker部署 |
| UI 变更 | 是 | ⚠️ 前端有改动,需冒烟测试主要页面 |
| 数据库 Schema | ⚠️ 是 | DSIP-18464 有新增 DDL,升级脚本需确认执行 |
升级前准备
- 📦 备份数据库:升级前对 DolphinScheduler 元数据库做完整备份(mysqldump / pg_dump)
- 📋 检查 DDL 脚本:核对
dolphinscheduler-dao/src/main/resources/sql/upgrade/3.5.0_schema/下新增脚本是否纳入升级流程 - 📝 阅读不兼容变更:重点检查 docs/docs/en/guide/upgrade/incompatible.md 中本月标记的 4 组 API 移除
- 🧪 检查自研集成:如使用 OpenAPI,用 grep 确认你们的代码里未用到这 3 个已移除接口:
cluster/query-by-code(PR #18584)task/update-with-upstream(PR #18569)- 动态子工作流相关 API(PR #18557)
- 💾 配置文件备份:备份
conf/目录所有配置
常见问题快速排查
| 现象 | 可能原因 | 排查方向 |
|---|---|---|
| 保存工作流时突然 403 | PR #18561 权限校验更严格 | 检查当前用户在目标项目是否有 write 权限;子工作流引用的上游工作流是否也在授权范围 |
| 子工作流无法引用 | PR #18597 新增跨项目校验 | 确认子工作流所在项目对当前用户授权 |
| 数据源绑定失败 403 | PR #18566 新增数据源校验 | 用户需在「数据源授权」中被授予对应数据源权限 |
| K8S 部署下告警 HTTP 测试失败 | PR #18574 前后逻辑差异 | 确认 Pod 网络策略;检查日志中是按 hostname 还是 IP 连接 |
| 升级后调度未按预期补火 | DSIP-18464 默认策略 Skip | 检查 missed_fire_policy 字段值;如需补跑请手动切换策略 |
| 任务重试总是立即触发(不按间隔) | PR #18539 修复后按 endTime 算 | 对比修复前后:重试时间 = 任务 结束时间 + retryInterval(非开始时间) |
| 工作流实例列表加载变慢或报错 | 大字段排除 VO 字段不匹配 | 检查前端版本是否同步升级;或回滚看 #18444/#18442 |
🙏 致谢
感谢 2026 年 8 月为 Apache DolphinScheduler 贡献代码的 10 位贡献者:@ruanwenjun, @njnu-seafish, @SEPURI-SAI-KRISHNA, @kittimzhe, @nikhiln64, @hellodml, @zhang-arvin, @liang-wenjie, @hiSandog, @SbloodyS
你们的每一个 PR 都让 DolphinScheduler 在稳定性、可用性与生态扩展上持续进化!💪
📑 附录:本月合并 PR 全量明细
Bug 修复(9 项)
| PR # | 标题 | 作者 | 合并时间 | 影响模块 | +Lines | -Lines | |
|---|---|---|---|---|---|---|---|
| #18541 | [Fix-18540][Master] Reset the runtime state when recreating a failed task instance (#18541) | @SEPURI-SAI-KRISHNA | 08-10 | dolphinscheduler-master | +132 | -0 | |
| #18539 | [Fix-18538][Master] Schedule task retry at endTime + retryInterval (#18539) | @SEPURI-SAI-KRISHNA | 08-11 | dolphinscheduler-master | +97 | -3 | |
| #18561 | [Fix-18559][API] Align workflow mutations with project write permissions (#18561) | @ruanwenjun | 08-19 | dolphinscheduler-api | +426 | -128 | |
| #18573 | [Fix-18570][Master] Detect wrapped CommandDuplicateHandleException in bootstrapError (#18570) (#18573) | @hellodml | 08-21 | dolphinscheduler-master | +136 | -1 | |
| #18566 | [Fix-18565][API] Validate datasource access for task definitions (#18566) | @ruanwenjun | 08-21 | dolphinscheduler-api | +342 | -17 | |
| #18583 | [Fix-18582][Authentication] Align actuator endpoint matching (#18583) | @ruanwenjun | 08-25 | misc | +149 | -11 | |
| #18597 | [Fix-18596][API] Enforce permission checks for sub-workflow references (#18597) | @ruanwenjun | 08-29 | dolphinscheduler-api | +450 | -0 | |
| #18574 | [Fix-17883] Fix K8s Alert HTTP test sending failed by using IP for non-StatefulSet pods (#17883) (#18574) | @zhang-arvin | 08-31 | dolphinscheduler-common | +10 | -3 | |
| #18434 | [Fix-18389][DataX] Read job definition from attached resource file when custom json is empty (#18434) | @nikhiln64 | 08-31 | dolphinscheduler-task-plugin | dolphinscheduler-ui | +344 | -8 |
性能优化(2 项)
| PR # | 标题 | 作者 | 合并时间 | 影响模块 | +Lines | -Lines | |||
|---|---|---|---|---|---|---|---|---|---|
| #18442 | [Improvement-18441][API&DAO] Optimize TaskInstanceMapper to exclude large text fields from list queries (#18442) | @njnu-seafish | 08-07 | dolphinscheduler-dao | +17 | -5 | |||
| #18444 | [Improvement-18443][API&DAO] Optimize WorkflowInstanceMapper to exclude large text fields from list queries (#18444) | @njnu-seafish | 08-26 | docs | dolphinscheduler-api | dolphinscheduler-dao | dolphinscheduler-master | +790 | -268 |
功能特性(6 项)
| PR # | 标题 | 作者 | 合并时间 | 影响模块 | +Lines | -Lines | |||
|---|---|---|---|---|---|---|---|---|---|
| #18557 | [Improvement-18556][API] Remove obsolete dynamic sub-workflow API (#18557) | @ruanwenjun | 08-18 | docs | dolphinscheduler-api | dolphinscheduler-common | dolphinscheduler-dao | +2 | -138 |
| #18560 | [Improvement-18558][API] Harden user list access and responses (#18560) | @ruanwenjun | 08-18 | dolphinscheduler-api | dolphinscheduler-dao | dolphinscheduler-ui | +65 | -28 | |
| #18564 | [Improvement-18563][API] Refine datasource authorization list APIs (#18564) | @ruanwenjun | 08-19 | dolphinscheduler-api | dolphinscheduler-dao | +102 | -62 | ||
| #18569 | [Improvement-18568][API] Remove obsolete task update-with-upstream API (#18569) | @ruanwenjun | 08-24 | docs | dolphinscheduler-api | dolphinscheduler-dao | +2 | -507 | |
| #18581 | [Improvement-18580][api] Fix typo in DataSourceServiceImpl log message (#18581) | @kittimzhe | 08-25 | dolphinscheduler-api | +1 | -1 | |||
| #18590 | [Improvement-18589][API] Align cluster query permissions (#18590) | @ruanwenjun | 08-26 | dolphinscheduler-api | +59 | -20 |
架构改进(6 项)
| PR # | 标题 | 作者 | 合并时间 | 影响模块 | +Lines | -Lines | |||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| #18478 | [Doc-18474][Upgrade] Fix zh/en incompatible upgrade docs out of sync (#18478) | @njnu-seafish | 08-10 | docs | +11 | -15 | |||||
| #18464 | [DSIP-18454][Scheduler] Add schedule missed fire policy (#18464) | @liang-wenjie | 08-12 | docs | dolphinscheduler-api | dolphinscheduler-common | dolphinscheduler-dao | dolphinscheduler-scheduler-plugin | dolphinscheduler-ui | +542 | -7 |
| #18408 | [Chore][Common] Handle parentless paths in FileUtils (#18408) | @hiSandog | 08-19 | dolphinscheduler-common | +17 | -1 | |||||
| #18578 | [Doc-18579] Fix malformed links in datasource and configuration docs (#18578) | @kittimzhe | 08-22 | docs | +3 | -3 | |||||
| #18584 | [Chore][API] Remove obsolete cluster query-by-code API (#18584) | @ruanwenjun | 08-28 | docs | dolphinscheduler-api | dolphinscheduler-ui | +5 | -90 | |||
| #18599 | [Chore] Remove unused code- #18599 (#18599) | @SbloodyS | 08-28 | dolphinscheduler-api | +0 | -11 |