抢占式批任务分配设计
摘要
对原先任务分配给某节点后,该节点宕机,这个节点的作业得不到处理问题进行改进,提出每个节点抢占式任务分配方式,避免因某节点宕机导致某些任务得不到处理的方案。
背景
目前批处理作业分为三个节点集群处理。
将作业分为三批,每个节点一批,分别标上节点 ip
每个节点根据自己 ip 查询到属于自己的作业,进行处理。
弊端:当某个节点宕机后,这个节点的作业得不到处理。
改进
需要添加字段:
历史执行 ip 列表
分配状态:null|已分配|已运行|已结束
分配失效时间:timestamp,预计任务务必完成时间。这个时间后如果‘分配状态’!=‘已结束’,此任务将被其他节点再次抢占执行。
结果状态:成功|失败
节点要增加的服务(http 接口):
节点存活,判断此节点是否存活。如果不存活,其他节点可抢占此节点‘分配失效时间’到期后未完成之任务。
抢占式任务分配
所以,改用节点抢占式任务分配方式,避免将任务分配给宕机的节点。
每个节点抢占一批作业并执行:
获取不存活 ip 列表
抢超时未完成的不存活节点的作业:
update 作业 set 执行ip=<自己节点ip>, 历史执行ip+=原执行ip where 执行ip in (不存活ip列表) and 分配失效时间>当前时间 and 分配状态!=‘已结束’
抢未分配的作业:
update 作业 set 执行ip=<自己节点ip> where 分配状态=null
自己的作业:
select from 作业 where 执行ip=<自己节点ip>
(就是上面 2 个步骤抢的作业)开始执行,并修改状态=已运行
执行完毕,修改状态=已结束,结果状态=成功|失败
若执行中宕机,等待达到‘失效时间’后,其他节点会抢占过来执行。
要做好,作业运行一半宕机,其他节点接过执行的正确逻辑。
评论