領導者事件處理

端點群組可以根據領導權的授予或撤銷來啟動和停止。這在叢集情境中非常有用,在這些情境中,共用資源必須僅由單一實例消耗。一個例子是輪詢共用目錄的檔案輸入通道適配器。(請參閱讀取檔案)。

若要參與領導者選舉並在當選領導者、領導權被撤銷或未能取得成為領導者的資源時收到通知,應用程式會在應用程式內容中建立一個名為「領導者啟動器」的元件。通常,領導者啟動器是一個 SmartLifecycle,因此它會在內容啟動時(可選)啟動,然後在領導權變更時發佈通知。您也可以透過將 publishFailedEvents 設定為 true (從 5.0 版開始)來接收失敗通知,以便在發生失敗時想要採取特定動作。依照慣例,您應該提供一個 Candidate 來接收回呼。您也可以透過架構提供的 Context 物件來撤銷領導權。您的程式碼也可以監聽 o.s.i.leader.event.AbstractLeaderEvent 實例(OnGrantedEventOnRevokedEvent 的父類別)並做出相應的回應(例如,使用 SmartLifecycleRoleController)。這些事件包含對 Context 物件的參考。以下清單顯示了 Context 介面的定義

public interface Context {

	boolean isLeader();

	void yield();

	String getRole();

}

從 5.0.6 版開始,內容提供對候選人角色的參考。

Spring Integration 提供基於 LockRegistry 抽象的領導者啟動器的基本實作。若要使用它,您需要將其建立為 bean 的實例,如下例所示

@Bean
public LockRegistryLeaderInitiator leaderInitiator(LockRegistry locks) {
    return new LockRegistryLeaderInitiator(locks);
}

如果鎖定登錄正確實作,則永遠最多只有一個領導者。如果鎖定登錄也提供在過期或損壞時擲回例外狀況(理想情況下為 InterruptedException)的鎖定,則無領導者期間的持續時間可以盡可能短,這取決於鎖定實作中的固有延遲。預設情況下,busyWaitMillis 屬性會增加一些額外的延遲,以防止在鎖定不完善的情況下(更常見的情況)CPU 飢餓,並且您只有在再次嘗試取得鎖定時才知道它們已過期。

請參閱Zookeeper 領導者事件處理,以取得有關使用 Zookeeper 的領導者選舉和事件的更多資訊。請參閱Hazelcast 領導者事件處理,以取得有關使用 Hazelcast 的領導者選舉和事件的更多資訊。