elastic job服務啟動時會通過失效轉移監聽管理器io.elasticjob.lite.internal.failover.FailoverListenerManager
啟動
實例下線監聽器和失效轉移設置改變監聽器,它們會對滿足的事件通知做失效轉移處理。
public void start() {
addDataListener(new JobCrashedJobListener());
addDataListener(new FailoverSettingsChangedJobListener());
}
實例下線監聽器
實例下線監聽器io.elasticjob.lite.internal.failover.FailoverListenerManager.JobCrashedJobListener
會監聽作業運行實例節點instances
的子節點的變化(NODE_REMOVED)。
// 滿足該條件時后續邏輯才會被執行
isFailoverEnabled() && Type.NODE_REMOVED == eventType && instanceNode.isInstancePath(path)
作業運行實例子節點為臨時節點,實例丟失(下線)時,臨時節點會自動被清除。此時,其他實例可以接收到通知。
1、忽略處理自己的下線通知
if (jobInstanceId.equals(JobRegistry.getInstance().getJobInstance(jobName).getJobInstanceId())) {
return;
}
2、處理下線實例分配的失效轉移分片
List<Integer> failoverItems = failoverService.getFailoverItems(jobInstanceId);
當監聽器收到有實例下線時(可以出現意外,也可能主動下線),會獲取下線實例已分配的失效轉移分片項集合(可能接管了其他實例的失效轉移分片),如果失效轉移分片集合不為空,則在新增節點leader/failover/items/分片項
。
leader/failover/items/分片項
一旦有作業崩潰,則會向此節點記錄。當有空閑作業服務器時,會從此節點抓取需失效轉移的作業項
3、處理下線實例分配的分片項
for (int each : shardingService.getShardingItems(jobInstanceId)) {
failoverService.setCrashedFailoverFlag(each);
failoverService.failoverIfNecessary();
}
如果下線的運行實例未接管失效轉移分片,則獲取該作業實例的運行分片項。針對每一個分片項新增節點leader/failover/items/分片項
。
上述每一個分片項在新增表示需要失效轉移的節點時,當前實例會立即發起選舉,確定由誰(存活的實例)立即執行該分片。
leader/failover/items/latch 分配失效轉移分片項時占用的分布式鎖,為curator的分布式鎖使用。
選舉結束后,獲勝的實例會在節點sharding/分片項/failover
中設置值未當前實例ID,然后刪除leader/failover/items/分片項
(表示已有實例負責該失效轉移分片,不再需要繼續處理),并立即執行該分片的任務調度。
失效轉移設置改變監聽器
zk任務配置修改為非失效轉移時,執行刪除作業失效轉移信息。即刪除節點sharding/分片項/failover
(所有分片項下的子節點failover均會被刪除).
failoverService.removeFailoverInfo();