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

调度思路

概念
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()

posted on 2016-01-07 00:40  laoniu85  阅读(362)  评论(0编辑  收藏  举报

导航