1

LTS-JOB 心跳模块设计

 3 years ago
source link: https://blog.shareworld.vip/archives/lts-job-heart1
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

LTS-JOB心跳模块设计

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

LTS-JOB 心跳模块设计

代码仓库:Github >> lts-job

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; check(node); } catch (Throwable ignore) {}), EcTopic.NODE_ADD);

在lts的心跳检测模块的设计中,是由client端主动想每一个jobtracker节点上班状态,同时也是检测在jobtracker是否正常提供服务。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK