領導事件處理

端點組可以根據領導權被授予或撤銷而分別啟動或停止。這在叢集場景中非常有用,在這些場景下共享資源只能由單個例項消費。一個例子是輪詢共享目錄的檔案入站通道介面卡。(請參閱讀取檔案)。

為了參與領導者選舉並在當選領導者、領導權被撤銷或獲取成為領導者所需資源失敗時收到通知,應用程式會在應用上下文中建立一個名為“領導者發起者”(leader initiator)的元件。通常,領導者發起者是一個 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 領導事件處理