什么叫做自診斷恢復蝗碎?善绎?
在分布式的場景下由于網(wǎng)絡、時鐘等原因捎谨,可能導致 Zookeeper 的數(shù)據(jù)與真實運行的作業(yè)產(chǎn)生不一致民效,這種不一致通過正向的校驗無法完全避免隘击。需要另外啟動一個線程定時校驗注冊中心數(shù)據(jù)與真實作業(yè)狀態(tài)的一致性,即維持 Elastic-Job 的最終一致性研铆。
public final class ReconcileService extends AbstractScheduledService
AbstractScheduledService是什么埋同??這里是guava實現(xiàn)的接口棵红⌒琢蓿看該接口的描述:
? AbstractScheduledService類用于在運行時處理一些周期性的任務。子類可以實現(xiàn) runOneIteration()方法定義一個周期執(zhí)行的任務逆甜,以及相應的startUp()和shutDown()方法虱肄。為了能夠描述執(zhí)行周期,你需要實現(xiàn)scheduler()方法交煞。通常情況下咏窿,你可以使用AbstractScheduledService.Scheduler類提供的兩種調(diào)度器: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,默認十分鐘,當有主節(jié)點御毅,且不需要分片根欧,且分片項中有下線的機器的時候,需要重設分片標記端蛆,在下次執(zhí)行的時候重新分片凤粗。
/**
* 查詢是包含有分片節(jié)點的不在線服務器.
*
* @return 是包含有分片節(jié)點的不在線服務器
*/
public boolean hasShardingInfoInOfflineServers() {
List<String> onlineInstances = jobNodeStorage.getJobNodeChildrenKeys(InstanceNode.ROOT);
int shardingTotalCount = configService.load(true).getTypeConfig().getCoreConfig().getShardingTotalCount();
for (int i = 0; i < shardingTotalCount; i++) {
//如果上線的機器列表中沒有分片參數(shù)的節(jié)點,則返回true今豆,需要重新分片嫌拣。
if (!onlineInstances.contains(jobNodeStorage.getJobNodeData(ShardingNode.getInstanceNode(i)))) {
return true;
}
}
return false;
}
fyi 這章比較水。呆躲。