elastic job 使用LeaderLatch选主功能分析

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方法时会被删除,监听会被触发,

靠前的节点就会成为主节点。

 

 

选主流程图

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值