9- 调度作业启动时的生命周期
9.1 注册启动信息
注册启动信息主要是启动调度之前做的一些初始化操作主要包含:
- 注册作业配置信息
- 注册实例信息
- 注册监听器
- 启动监听服务
- 启动诊断服务
每一步执行逻辑都比较重要并且包含了特定的逻辑。其中作业配置信息的注册在前面我们已经了解过,作业核心的配置信息以JSON的格式存储在作业的config节点下面,下面我们就来看下其余部分的启动逻辑。
9.2 启动信息注册
启动信息的注册在初始化方法中通过调用调度器门面对象schedulerFacade的registerStartUpInfo方法来触发,如下代码所示:
schedulerFacade.registerStartUpInfo(!liteJobConfigFromRegCenter.isDisabled());
启动信息的注册主要是调度系统向Zookeeper注册调度作业需要的一些基本信息和开启几个用于诊断作业健康状态的服务功能,用于在作业正常执行时候直接使用,将这些基本信息进行分类主要包含如下部分:
- 作业的服务实例信息节点(instances临时子节点和servers持久节点)
- 主节点信息(leader节点)
- 分片信息(sharding节点)
- 本地开启监控服务
- 本地开启诊断服务
先来看一下注册启动信息的代码,整体来浏览下流程,后面我们再详细去看每一步的操作。启动逻辑代码如下:
public void registerStartUpInfo(final boolean enabled) {
//开启所有监听器.
listenerManager.startAllListeners();
//选举主节点
leaderService.electLeader();
//持久化作业服务器上线信息
serverService.persistOnline(enabled);
//持久化作业运行实例上线相关信息
instanceService.persistOnline();
//设置需要重新分片的标记
shardingService.setReshardingFlag();
//初始化作业监听服务
monitorService.listen();
//调解分布式作业不一致状态服务
if (!reconcileService.isRunning()) {
reconcileService.startAsync();
}
}
在这里我们可以看到registerStartUpInfo做了很多启动的逻辑,在了解详细实现的之前,先给大家普及下每一个逻辑的作用。
- 开启监听器:监听器主要是用来订阅调度作业写入到Zookeeper上节点状态的变更,其中包含了主节点,分片信息,作业运行信息,触发信息等节点状态的监听,在分布式场景下如果有其他机器下的作节点状态发生了变更或者针对作业进行了操作,当前进行订阅的进程节点可以及时感知到并及时做出合理的操作。
- 进行主节点选举:这里主要说下主节点的作用,调度作业的执行是基于逻辑的分片来执行的不依赖于底层机器实例,而每个机器进程的分片获取是需要主节点来进行分配的,就像是有一群员工需要进行任务分配了,每个人都不想做任务,或者都想要做更多的任务,每个人自己来选择执行任务数量,最终是无法形成一致的意见的,这个时候就需要选出来一个领导,领导分配任务给员工,选主节点就类似于选领导一样。
- 上线服务器和运行实例信息:这里一共有两个存储机器IP信息的节点在Zookeeper上创建,一个是持久的servers子节点,一个是临时的instances子节点,持久的servers子节点用来存储作业实例信息的状态比如禁用还是启用,而临时的instances节点可以用来标示哪个机器的作业进程在运行,在线的进程与Zookeeper保持连接临时节点存在,下线的进程则临时节点被自动移除。
- 设置分片标记:前面我们提到主节点的时候有说到主节点用来为机器分配分片那什么时候需要分配分片呢,就需要一个标示何时需要分片的标记,这一步就是在启动的时候写入一个待分片的标记节点来标示进程启动后是需要进行分片的,真正执行分片的逻辑是在作业到了触发时间执行作业时才做的。
- 初始化作业监听服务:作业监听服务也可以说是作业监控服务,这一步对外暴漏TCP端口,在进程运行过程中可以随时使用TCP通信针对此端口发送命令来获取当前进程下所有作业的运行情况,来进行问题的排查诊断。
- 开启诊断检测服务:这一步主要做一些补偿操作开启一个定时任务检测,作业节点状态是否正常,来做一些调节操作,保证作业正常运行。