fastflow icon indicating copy to clipboard operation
fastflow copied to clipboard

对于DAG中的cron字段

Open cplinux98 opened this issue 2 years ago • 2 comments

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

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

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

cplinux98 avatar Jan 14 '23 02:01 cplinux98

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

philhuan avatar Jan 14 '23 07:01 philhuan

在最初的内部场景中是需要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 avatar Jan 14 '23 13:01 ShiningRush