Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

对于DAG中的cron字段 #12

Open
cplinux98 opened this issue Jan 14, 2023 · 2 comments
Open

对于DAG中的cron字段 #12

cplinux98 opened this issue Jan 14, 2023 · 2 comments
Labels
enhancement New feature or request

Comments

@cplinux98
Copy link

我看到DAG中有一个cron字段,但源码里并未具体实现关于定时任务的相关处理,这部分是在外部处理吗?还是在内部处理,但是开源版本并未实现该功能,如果我想要自己在内部实现的话,能提供一个大概的思路吗?

我的思路是这样:在派发任务的Dispatcher组件中,去判断是否带有cron参数,如果带有cron参数,就启用goroutine并使用cron库来定时去派发任务到节点上去执行。

我是刚学了go语言,想做一个小的demo来熟练go在项目上的应用,对于上面的思路可能有思考的欠缺,如果有可能,希望能够得到你的指点

@philhuan
Copy link
Contributor

在启动的时候,扫描所有带cron的dag,然后启动协程去执行cron,那如果重启的时候刚好有一个任务到时间了,重启完了刚好又过了,这种怎么解决呢。

@ShiningRush
Copy link
Owner

在最初的内部场景中是需要cron这个字段,但是因为我们内部存在一个遗留服务,可以用于按照cron的方式去自动调度任务,因此直接把遗留服务改造成了对DAGInstance的创建,所以没在fastflow中支持cron功能。
现在想来除了 @philhuan 提到的问题外,我这里补充一些想法:

  1. 执行cron的模块一定是一个独立的模块,并且运行在master的节点,因为它的职责是相对独立且复杂的,不要耦合到现存模块,可以叫做TimerTrigger
  2. 对Cron的实现不推荐创建多个线程,大批量Dag情况会有性能缺陷,建议使用时间轮
  3. 对于@phihuan 提到的重启问题,这里分几个角度来看
  • TimerTrigger 所处的 Master 节点尽量不要出现空置的情况(即master退出后,下一任master当选的这个空档期),否则这个时间段的cron一定会 miss,将master模块和woker模块分开部署可以缓解这个情况。
  • 对于miss的cron,可以在dag上记录下上次cron触发的时间,这样就可以master组件起来自动补发由于重启而导致的miss

@ShiningRush ShiningRush added the enhancement New feature or request label Jun 1, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

3 participants