Я пытаюсь реализовать простую систему, основанную на выборах лидеров, в которой моя основная бизнес-логика приложения работает на узле избранного лидера. В рамках приобретения лидерства основная бизнес-логика запускает различные другие сервисы. Я использую рецепт Apache Curator LeaderSelector для реализации процесса выбора лидера.
В моей системе узел, выбранный в качестве лидера, сохраняет лидерство до тех пор, пока из-за отказа не будет выбран другой лидер. Другими словами, получив лидерство, я не хочу от него отказываться.
Согласно документации Curator LeaderSelection, лидерство прекращается, когда возвращается метод takeLeadership()
. Я хочу этого избежать, и я сейчас просто заблокирую возврат, введя цикл ожидания.
Мой вопрос:
- Это правильный способ реализовать лидерство?
Является ли цикл ожидания (как показано в примере кода ниже) правильным способом блокировки?
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(); } } } } }