LTS-JOB 心跳模块设计
代码仓库:Github >> lts-job
心跳策略
心跳是一个class编写完成,代码放在lts-core组件中,被tasktracker、jobclient引入加载到内存并在start时启动内置循环任务不停的心跳检测。
心跳检测是tasktracker和jobclient去检测jobtracker节点是否正常,这里可以抽象模拟成client检测server是否活着。在lts-job平台高可用架构中,每个client启动拉取到server的机器清单,然后依次检测集群下每个server是否活着,心跳失败便从清单中移除。
源代码查看:HeartBeatMonitor.java
心跳检测分为两个模块:30s和500ms检测,相互间切换启动和关闭。
30s 检测
private final ScheduledExecutorService PING_EXECUTOR_SERVICE = Executors.newScheduledThreadPool(1, new NamedThreadFactory("LTS-HeartBeat-Ping", true));
独立的任务线程每隔30秒启动一个线程负责检测心跳是否正常。
pingScheduledFuture = PING_EXECUTOR_SERVICE.scheduleWithFixedDelay( new Runnable() { @Override public void run() { if (pingStart.get()) { ping(); } } }, 30, 30, TimeUnit.SECONDS);
500ms 检测
fastPingScheduledFuture = FAST_PING_EXECUTOR.scheduleWithFixedDelay( new Runnable() { @Override public void run() { if (fastPingStart.get()) { ping(); } } }, 500, 500, TimeUnit.MILLISECONDS);
在节点启动和jobtracker发生不可用事件时,启动高频检测。
启动检测机制
这里把tasktracker和jobclient逻辑上定义为client,jobtracker定义为server,后面统一如此称呼。
程序启动时
在tasktracker和jobclient的客户端程序中,启动时会调用job-core包里的抽象类AbstractClientNode的start()方法,而内部再调用HeartBeatMonitor.start()方法来启动心跳检测。
client端启动时会先启动500ms心跳检测模式,正常后就转为30s一次的心跳检测。
在30s检测模式下会启动一个server不可以的事件监听类,当触发时会离开切换到500ms的模式下。
jobtracker节点新增时
当client启动时心跳检测程序会注册一个server节点增加(NODE_ADD)的心跳事件(lts自带jvm EV模式)监听类。
appContext.getEventCenter().subscribe(new EventSubscriber(HeartBeatMonitor.class.getName()
+ "_NODE_ADD_" + appContext.getConfig().getIdentity(), new Observer() {
@Override
public void onObserved(EventInfo eventInfo) {
Node node = (Node) eventInfo.getParam("node");
if (node == null || NodeType.JOB_TRACKER != node.getNodeType()) {
return;
}
try {
check(node);
} catch (Throwable ignore) {
}
}
}), EcTopic.NODE_ADD);
总结
在lts的心跳检测模块的设计中,是由client端主动想每一个jobtracker节点上班状态,同时也是检测在jobtracker是否正常提供服务。