目錄
目錄.png
分布式定時任務(wù)系列
- 分布式定時任務(wù)elastic-job(一)
- 分布式定時任務(wù)elastic-job(二)
- 分布式定時任務(wù)elastic-job(三)
- 分布式定時任務(wù)elastic-job(四)
自診斷恢復(fù)
-
解決分布式作業(yè)不一致狀態(tài)ReconcileService,AbstractScheduledService是guava提供的,scheduler方法配合runOneIteration,定時操作
ReconcileService.png - 如果是主作業(yè)節(jié)點 而且 當(dāng)前作業(yè)不需要重新分片 而且 查詢是包含有分片節(jié)點的不在線服務(wù)器,那么設(shè)置需要重新分片的標(biāo)記。這樣達(dá)到自診斷修復(fù)
// 定時每分鐘執(zhí)行的方法
@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)) { // 校驗是否達(dá)到校驗周期
// 設(shè)置最后校驗時間
lastReconcileTime = System.currentTimeMillis();
// 主作業(yè)節(jié)點 而且 當(dāng)前作業(yè)不需要重新分片 而且 查詢是包含有分片節(jié)點的不在線服務(wù)器
if (leaderService.isLeaderUntilBlock()
&& !shardingService.isNeedSharding()
&& shardingService.hasShardingInfoInOfflineServers()) {
log.warn("Elastic Job: job status node has inconsistent value,start reconciling...");
// 設(shè)置需要重新分片的標(biāo)記
shardingService.setReshardingFlag();
}
}
}
// 定時每分鐘執(zhí)行
@Override
protected Scheduler scheduler() {
return Scheduler.newFixedDelaySchedule(0, 1, TimeUnit.MINUTES);
}
事件追蹤
- 基于guava的EventBus實現(xiàn),是一種優(yōu)雅的觀察者模式實現(xiàn)方式。
- 兩種作業(yè)事件
JobStatusTraceEvent, 作業(yè)狀態(tài)追蹤事件,比如五個分片就記錄一條, 整體的狀態(tài)
JobExecutionEvent, 作業(yè)執(zhí)行追蹤事件,比如五個分片記錄每個分片執(zhí)行的情況 - JobEventRdbStorage, 作業(yè)事件數(shù)據(jù)庫存儲, 存儲時是用jdbc執(zhí)行的,基于數(shù)據(jù)庫的操作,查詢也是基于數(shù)據(jù)庫查詢
- 當(dāng)然也可以自定義事件追蹤,比如es實現(xiàn),通過配置JobEventConfig中JobEventListener自定義就可以實現(xiàn)了
// JobEventBus注冊監(jiān)聽器,不同監(jiān)聽器可以實現(xiàn)不同的存儲方式,比如默認(rèn)的關(guān)系型數(shù)據(jù)庫存儲
private void register() {
try {
eventBus.register(jobEventConfig.createJobEventListener());
isRegistered = true;
} catch (final JobEventListenerConfigurationException ex) {
log.error("Elastic job: create JobEventListener failure, error is: ", ex);
}
}
elastic-job cloud
- 額外提供了進(jìn)程隔離之類的,瞬時任務(wù)提供進(jìn)程級調(diào)度場景mesos是c++寫的, 瞬時任務(wù)是cloud提供的能力,長時間執(zhí)行資源不緊張時,創(chuàng)建進(jìn)程,執(zhí)行完,銷毀進(jìn)程,nginx也是進(jìn)程級的
- elastic-Job-cloud使用Mesos + Docker(TBD)的解決方案,額外提供資源治理, 應(yīng)用分發(fā)以及進(jìn)程隔離等服務(wù)
elastic-job的一些思考
- 用分布式鎖進(jìn)行失效任務(wù)拿取是為了集群能力能提供服務(wù),有master節(jié)點是為了分配分片之類的這樣就不用每次獲取分布式鎖了,簡單高效
- elastic-job異常情況
- 擴(kuò)容收容 有監(jiān)聽
- 宕機(jī)
- zk失連 又連上
- 分片時節(jié)點下線,先選主再分片
- 這種主節(jié)點選舉方式有可能腦裂?實際上elastic-job用了zk分布式鎖,zk分布式鎖后續(xù)可以深入研究下,zk本身也能防止腦裂,而且連不上zk的作業(yè)服務(wù)器將立刻停止執(zhí)行作業(yè),防止主節(jié)點已重新分片,而腦裂的服務(wù)器還在執(zhí)行
- elastic-job無中心的思想,cloud是中心化外提供了高級特性
- elastic-job通過zk節(jié)點變化感知服務(wù)上線下線,連接失連,感知后,可以通過代碼保證高可用
分布式定時任務(wù)技術(shù)選型
quartz
- 不提供分布式
xxl-job
- 基于數(shù)據(jù)庫,瓶頸在數(shù)據(jù)庫,適合服務(wù)時的情況,服務(wù)量大,數(shù)據(jù)庫壓力大,性能下降,個人維護(hù)
elastic-job
- lite無中心化,適合服務(wù)多,量大,性能不受數(shù)據(jù)庫影響,當(dāng)當(dāng)維護(hù)貢獻(xiàn)給apache了
其他
- 其他的開源框架文檔少
總結(jié)
-
借用參考文章7的圖
總結(jié).png