Apache Curator LeaderSelector:Wie kann man vermeiden, die Führung aufzugeben, indem man die takeLeadership()-Methode nicht verlässt?
-
21-12-2019 - |
Frage
Ich versuche, ein einfaches, auf der Wahl des Anführers basierendes System zu implementieren, bei dem meine Hauptgeschäftslogik der Anwendung auf dem Knoten des gewählten Anführers ausgeführt wird.Im Rahmen der Führungsübernahme startet die Hauptgeschäftslogik verschiedene andere Dienstleistungen.Ich verwende das Apache Curator LeaderSelector-Rezept, um den Leader-Auswahlprozess zu implementieren.
In meinem System behält der Knoten, der als Anführer ausgewählt wird, die Führung, bis ein Fehler die Auswahl eines anderen Anführers erzwingt.Mit anderen Worten: Sobald ich die Führung übernommen habe, möchte ich sie nicht mehr abgeben.
Laut der Dokumentation von Curator LeaderSelection wird die Führung abgegeben, wenn die takeLeadership()
Methode gibt zurück.Ich möchte es vermeiden und blockiere im Moment einfach die Rückgabe, indem ich eine Warteschleife einführe.
Meine Frage ist:
- Ist das der richtige Weg, Führung umzusetzen?
Ist die Warteschleife (wie im Codebeispiel unten gezeigt) der richtige Weg zum Blockieren?
public class MainBusinessLogic extends LeaderSelectorListenerAdapter { private static final String ZK_PATH_LEADER_ROOT = "/some-path"; private final CuratorFramework client; private final LeaderSelector leaderSelector; public MainBusinessLogic() { client = CuratorService.getInstance().getCuratorFramework(); leaderSelector = new LeaderSelector(client, ZK_PATH_LEADER_ROOT, this); leaderSelector.autoRequeue(); leaderSelector.start(); } @Override public void takeLeadership(CuratorFramework client) throws IOException { // Start various other internal services... ServiceA serviceA = new ServiceA(...); ServiceB serviceB = new ServiceB(...); ... ... serviceA.start(); serviceB.start(); ... ... // We are done but need to keep leadership to this instance, else all the business // logic and services will start on another node. // Is this the right way to prevent relinquishing leadership??? while (true) { synchronized (this) { try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } } }
Lösung
LeaderLatchAnstelle von wait() können Sie einfach Folgendes tun:
Thread.currentThread().join();
Aber ja, das ist richtig.
Übrigens – wenn Sie eine andere Methode bevorzugen, können Sie LeaderLatch mit einem LeaderLatchListener verwenden.