LTS-JOB心跳模块设计

Owen Jia 2020年06月08日 954次浏览

LTS-JOB 心跳模块设计

代码仓库:Github >> lts-job

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是否正常提供服务。