
点亮⭐️
https://github.com/apache/
点击蓝字 关注我们
Apache DolphinScheduler 本身并没有针对任务组槽位设计"超时强制回收"的功能;它的"自动回收"机制其实是一致性纠正 + 正常释放 + 强制启动三种手段的组合,全部由 TaskGroupCoordinator 后台线程周期性执行完成。
如果要解决任务组资源被长时间占用时,想要让系统自动回收槽位,你可以利用 dealWithForceStartTaskGroupQueue 的强制启动逻辑,或者通过监控 amendTaskGroupUseSize 的纠正机制来间接实现"长时间占用后自动放行"的效果。
深度解析
TaskGroupCoordinatorTaskGroupCoordinator 是 Master 端管理任务组槽位的核心组件,实现了 ITaskGroupCoordinator 接口 。它启动一个专用守护线程 TaskGroupCoordinator-Thread,每 5 秒轮询一次,依次执行 4 个关键步骤:

ITaskGroupCoordinator 的类注释清楚地说明了槽位获取/释放的语义:任务实例需要任务组时调用 acquireTaskGroupSlot(非阻塞,只是入队等待),任务完成后调用 releaseTaskGroupSlot 释放槽位。
正常情况下,任务实例结束时会调用 releaseTaskGroupSlot,其内部通过 deleteTaskGroupQueueSlot 从队列删除记录、释放槽位。释放后,后台线程的 dealWithWaitingTaskGroupQueue 会扫描每个未满的任务组,按优先级取出等待队列中的任务,尝试原子性地 acquireTaskGroupSlot 数据库更新,成功后通过 RPC notifyWaitingTaskInstance 唤醒等待的 Master 上的任务实例。
若通知过程失败(例如目标 WorkflowInstance 已经 failover、host 为空,或任务状态已经不是 SUBMITTED_SUCCESS),notifyWaitingTaskInstance会抛出 UnsupportedOperationException,这时会直接调用 deleteTaskGroupQueueSlot 释放该无效占用的队列记录,防止槽位被"僵尸"任务长期占用。
当运维人员在页面上手动点击"强制启动"时,对应的 TaskGroupQueue 记录会被标记 forceStart = YES。后台线程的 dealWithForceStartTaskGroupQueue 会专门查询这些记录,无视资源池上限,直接唤醒对应任务并从队列中删除 。这是目前系统提供的唯一的人工/半自动"强制回收"入口——本质上是绕过槽位限制而不是真正"回收"被占用的槽位。
amendTaskGroupUseSize 和 amendTaskGroupQueueStatus 这两步从命名上看是做"纠正"(use_size 与实际队列数量对齐、队列状态修正),属于数据一致性维护,而非"占用超时后强制踢出"。若你需要自动超时回收,目前只能:
releaseTaskGroupSlot 正常释放;dealWithForceStartTaskGroupQueue。查看当前占用情况:
View Task Group Queue 章节。数据库层排查:
t_ds_task_group_queue 表,利用 queryTheHighestPriorityTasks(按优先级取队首)或 queryByTaskId 这类 mapper SQL 定位长期处于 WAIT_QUEUE 或 ACQUIRE_SUCCESS 但对应任务已经异常结束的记录。手动强制回收:
dealWithForceStartTaskGroupQueue 流程,将其从队列中删除并释放槽位。架构层面理解并发控制:
Notes
TaskGroupQueueMapper.xml
updateInQueueLimit1、updateInQueueCAS 等 SQL 展示了槽位状态更新采用 CAS 方式保证并发安全,但这些细节偏底层实现,与"长时间占用回收"主题关系较弱,仅供了解并发控制方式参考。END

用户案例

迁移实战

最新发版消息

加入社区
关注社区的方式有很多:
同样地,参与Apache DolphinScheduler 有非常多的参与贡献的方式,主要分为代码方式和非代码方式两种。
非代码方式包括:
完善文档、翻译文档;翻译技术性、实践性文章;投稿实践性、原理性文章;成为布道师;社区管理、答疑;会议分享;测试反馈;用户反馈等。
代码方式包括:
查找Bug;编写修复代码;开发新功能;提交代码贡献;参与代码审查等。


你的好友小海豚拍了拍你
并请你帮她点一下“分享”
