基于Redis的任务调度

基于redis的动态任务调度平台,支持 动态groovy任务和静态任务(任务要继承IJob接口)

任务调度平台:
这里假设任务失败有两种类型:
一、worker节点与master节点失去联系,认为任务失败
二、worker节点执行任务出错,这里认为该出错一定可以被worker节点捕获,worker节点会停止任务
规范:
worker:
启动一个任务: /job/start/taskID 首先获取执行任务的锁,然后获取task:如果为空则执行任务,如果等于自己地址则返回正在执行,如果不等于自己地址,则返回skip,执行:从redis获取任务的配置信息,执行调度 ok/skip/error msg,只有启动了才返回ok
停止一个任务: /job/stop/taskID 停止任务,删除task:taskID ok/skip/error msg,只有停止了才返回ok,或略返回skip
任务完成回调:任务完成后删除task:taskID,删除schedule:taskID
任务失败回调:任务失败后删除task:taskID
master:
/job/add 简单检查参数合法后保存到 taskID conf 下
/job/del/taskID 首先stop所有task 如果失败返回失败(失败只网络连接成功,但http返回失败),如果成功删除任务配置

/job/start/taskID 获取jobconf,设置schedule:taskID ,设置fire:taskID //直接分发任务到各个worker节点
/job/stop/taskID 删除fire:taskID,删除schedule:taskID,给所有节点发送stop命令


// 对于周期任务,master只要不断设置fire:taskID就可,对于单次执行任务,master应该监测任务是否执行成功


key: worker:ip:port value poolSize (worker端心跳设置,master端读取来发送任务请求)即表示一个注册Worker节点,又表示该节点上的任务数量(resume job的时候选择Job数量最少的节点执行Job)
key: task:taskID value: ip:port (worker端设置)表示某个任务在某个worker节点上执行,单次有效,执行完毕或者被stop都会清除,而且还有个过期时间,过期后才能重试任务
key: lock:task:taskID value: 0/1 表示某个任务的分布式锁,只有获取到锁的时候才能执行任务,锁的作用:在Master节点分配任务时防止子节点重复执行任务

key: schedule:taskID value on/off 标记某个任务正在接受调度,当单次任务完成或者任务stop/del时这个值会被移除
key:taskID value:conf 代表某个任务的具体信息,conf代表任务的详细详细,应该包含执行该任务的所有信息

key: fire:taskID value:delayTime 某个任务、周期任务到下一次执行的时间

关于任务是否会重复执行:
任务执行时先检查 task:taskID这个key如果不存在才执行,如果存在,并地址不匹配自己则不会执行,否则才执行任务


猜你喜欢

转载自blog.csdn.net/jsenht/article/details/80464125