elastic job 选主功能介绍
elastic job在启动的时候会进行选主,使用的是curator的LeaderLatch类进行选主,选主成功之后会执行回调操作
LeaderElectionExecutionCallback
if (!hasLeader()) {
jobNodeStorage.fillEphemeralJobNode(LeaderNode.INSTANCE, JobRegistry.getInstance().getJobInstance(jobName).getJobInstanceId());
}
回调的主要目的是在zookeeper上注册主节点的实例id信息,目的是为了定时任务执行时让主节点完成分片动作,而不是所以节点都去执行分片。
LeaderLatch选主
public void executeInLeader(final String latchNode, final LeaderExecutionCallback callback) {
try (LeaderLatch latch = new LeaderLatch(getClient(), jobNodePath.getFullPath(latchNode))) {
latch.start();
latch.await();
callback.execute();
} catch (final Exception ex) {
handleException(ex);
}
}
当调用start方法之后,会创建一个单线程的线程池异步完成选主动作,当前线程会进行阻塞,直到当前节点完成选主操作之后
会调用notifyall方法,唤醒主线程,然后执行callback.execute()方法。整个执行过程中多次用到了watcher监听和inBackground
异步操作。
如client.getData().usingWatcher(watcher).inBackground(callback).forPath(ZKPaths.makePath(latchPath, watchPath));
usingWatcher给节点注册一个watcher 节点发生变化时会触发回调,并且只能 使用一次
如果注册的时候节点不存在,则注册不成功。
inBackground
Curator 引入了BackgroundCallback 接口,用来处理服务器端返回来的信息,这个处理过程是在异步线程中调用,默认在 EventThread 中调用,也可以自定义线程池
如果不使用inBackground,当节点不存在时会报错,使用inBackground即使节点不存在也不会报错。
临时顺序节点
根据节点的序号进行排序,而后面的节点会监听前面的节点通过注册watcher,当前面的节点调用close方法时会被删除,监听会被触发,
靠前的节点就会成为主节点。
选主流程图