領導事件處理
端點組可以根據領導權被授予或撤銷而分別啟動或停止。這在叢集場景中非常有用,在這些場景下共享資源只能由單個例項消費。一個例子是輪詢共享目錄的檔案入站通道介面卡。(請參閱讀取檔案)。
為了參與領導者選舉並在當選領導者、領導權被撤銷或獲取成為領導者所需資源失敗時收到通知,應用程式會在應用上下文中建立一個名為“領導者發起者”(leader initiator)的元件。通常,領導者發起者是一個 SmartLifecycle
,因此它會在上下文啟動時(可選地)啟動,然後在領導權發生變化時釋出通知。你還可以透過將 publishFailedEvents
設定為 true
來接收失敗通知(從 5.0 版本開始),以便在發生故障時採取特定行動。按照慣例,你應該提供一個接收回調的 Candidate
。你還可以透過框架提供的 Context
物件撤銷領導權。你的程式碼還可以監聽 o.s.i.leader.event.AbstractLeaderEvent
例項(它是 OnGrantedEvent
和 OnRevokedEvent
的超類)並做出相應的響應(例如,透過使用 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 領導事件處理。