elasticjob已下线_elasticJob 源码解析之自诊断恢复

什么叫做自诊断恢复??

在分布式的场景下由于网络、时钟等原因,可能导致 Zookeeper 的数据与真实运行的作业产生不一致,这种不一致通过正向的校验无法完全避免。需要另外启动一个线程定时校验注册中心数据与真实作业状态的一致性,即维持 Elastic-Job 的最终一致性。

public final class ReconcileService extends AbstractScheduledService

AbstractScheduledService是什么??这里是guava实现的接口。看该接口的描述:

​ AbstractScheduledService类用于在运行时处理一些周期性的任务。子类可以实现 runOneIteration()方法定义一个周期执行的任务,以及相应的startUp()和shutDown()方法。为了能够描述执行周期,你需要实现scheduler()方法。通常情况下,你可以使用AbstractScheduledService.Scheduler类提供的两种调度器:newFixedRateSchedule(initialDelay, delay, TimeUnit) 和newFixedDelaySchedule(initialDelay, delay, TimeUnit)。

懂了,就是一个周期性任务。接着往下看。

@Override

protected void runOneIteration() throws Exception {

LiteJobConfiguration config = configService.load(true);

int reconcileIntervalMinutes = null == config ? -1 : config.getReconcileIntervalMinutes();

if (reconcileIntervalMinutes > 0 && (System.currentTimeMillis() - lastReconcileTime >= reconcileIntervalMinutes * 60 * 1000)) {

lastReconcileTime = System.currentTimeMillis();

if (leaderService.isLeaderUntilBlock() && !shardingService.isNeedSharding() && shardingService.hasShardingInfoInOfflineServers()) {

log.warn("Elastic Job: job status node has inconsistent value,start reconciling...");

shardingService.setReshardingFlag();

}

}

}

@Override

protected Scheduler scheduler() {

return Scheduler.newFixedDelaySchedule(0, 1, TimeUnit.MINUTES);

}

在runOneIteration中获取配置项reconcile-interval-minutes,默认十分钟,当有主节点,且不需要分片,且分片项中有下线的机器的时候,需要重设分片标记,在下次执行的时候重新分片。

/**

* 查询是包含有分片节点的不在线服务器.

*

* @return 是包含有分片节点的不在线服务器

*/

public boolean hasShardingInfoInOfflineServers() {

List onlineInstances = jobNodeStorage.getJobNodeChildrenKeys(InstanceNode.ROOT);

int shardingTotalCount = configService.load(true).getTypeConfig().getCoreConfig().getShardingTotalCount();

for (int i = 0; i < shardingTotalCount; i++) {

//如果上线的机器列表中没有分片参数的节点,则返回true,需要重新分片。

if (!onlineInstances.contains(jobNodeStorage.getJobNodeData(ShardingNode.getInstanceNode(i)))) {

return true;

}

}

return false;

}

fyi 这章比较水。。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值