调度思路+EurekaServer获得当前机器的instanceid

时间:2022-04-24 08:31:15

调度思路

概念

Build 一次完整的构建 整个流水线

Task(BuidStep) 流水线中的某一个步骤单元

先假设对于一个Build(流水线)而言里面所有Task是串行执行的

并且各Task之间不需要文件共享

前端:

  1. 创建一个Build及Build里的所有Task 先持久化,然后将Build的ID发送给调度服务。

调度:

2.调度服务:

收到一个Buildid,取出Build信息
查看有没有空闲的机器
有空闲的机器
查看是否有需要执行的Build(先检查传入的Build,如果传入的Build并不需要执行了,则再看有没有其他要执行的Build,此处容易产生竞争):
有要执行的Build:
有要执行的Task:
调用BuildService(发送taskId)执行对应的任务,在Task上记录执行者的id.
没有要执行的任务:
更新Build的状态,回到检查是否有要执行的Build
没有要执行的Build:
什么也不做
没有空闲的机器:
则什么也不做 收到一个taskId,通过taskId取出Build信息,执行与收到Build相同的逻辑。

构建服务:

收到一个taskId

将这个task标记为正在执行的状态,如果发现这个task已经被别人执行,则什么也不用做.

执行这个任务  将自己标记为忙的状态
任务执行完毕后异步更新任务的状态,并且通知调度服务该taskid执行完毕. 将自己标记为空闲的状态.

问题:

中间出现异常时,可能导致后续的任务也没有执行,或过了很久才被别的条件给触发。

可能需要更多的规则.

如何实现异步持久化数据:

将sheduleBuild的FutureTask保存到容器对象中,使用定时器检查该对象的状态。如果对象为isDone则持久化相关的数据.

DiscoveryManager.getInstance().discoveryClient.instanceInfo.getInstanceId()