libi / dcron

轻量分布式定时任务库 a lightweight distributed job scheduler library
MIT License
422 stars 73 forks source link

集群稳定性维护 #57

Closed dxyinme closed 1 year ago

dxyinme commented 1 year ago

在集群增减节点,哈希环同步时间中执行的任务可能会丢失或者被重复执行,这个可能需要有一个可行的稳定性维护方案。

libi commented 1 year ago

一个可行方案是各个节点同步timeout加各个节点时间误差范围内的任务执行记录,当检测到节点发生变化时,下一次的任务执行全部进入待执行,等待timeout时间再次判断节点是否发生变化,如无变化则对待执行的任务根据任务记录进行判重后重新hash选举执行. 存在的弊端为在集群抖动期间任务执行时间可能出现最长timeout的误差.

dxyinme commented 1 year ago

一个可行方案是各个节点同步timeout加各个节点时间误差范围内的任务执行记录,当检测到节点发生变化时,下一次的任务执行全部进入待执行,等待timeout时间再次判断节点是否发生变化,如无变化则对待执行的任务根据任务记录进行判重后重新hash选举执行. 存在的弊端为在集群抖动期间任务执行时间可能出现最长timeout的误差.

我觉得这会是一种蛮好的解决方案,那就按照这么做了。我可以留出interface让用户自己实现新的降低误差的方法。

libi commented 1 year ago

更具体实现可以为集群增加集群状态: 伸缩状态与正常状态。当检测到当前节点列表与上一次节点列表不一致时,集群进入伸缩态。等待一个检测周期(timeout)如果如上次节点列表一致,则进入正常态。 集群处于伸缩态时所有可任务任务进入待执行列表。 集群从伸缩态进入正常态时:1. 依据最新的hash依次执行待执行任务列表。 2. 对比任务执行记录与cron执行计划对遗漏的任务冲执行(为了解决可能存在的任务的丢失:在执行任务的前一刻执行节点掉线,其他节点还未感知到时)