領導者事件處理
端點群組可以根據領導權的授予或撤銷來啟動和停止。這在叢集情境中非常有用,在這些情境中,共用資源必須僅由單一實例消耗。一個例子是輪詢共用目錄的檔案輸入通道適配器。(請參閱讀取檔案)。
若要參與領導者選舉並在當選領導者、領導權被撤銷或未能取得成為領導者的資源時收到通知,應用程式會在應用程式內容中建立一個名為「領導者啟動器」的元件。通常,領導者啟動器是一個 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 的領導者選舉和事件的更多資訊。