Apache Cupator LeaderSelector : TakeLeadership () 메소드에서 종료되지 않아 리더십을 포기하지 않는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com//questions/25030262

문제

응용 프로그램의 주요 비즈니스 논리가 선출 된 리더 노드에서 실행되는 간단한 리더 선거 기반 시스템을 구현하려고합니다.리더십을 획득 한 일환으로 주요 사업 논리는 다양한 다른 서비스를 시작합니다.리더 선택 프로세스를 구현하기 위해 Apache Cupator LeaderSelector 래서 피터 레시피를 사용하고 있습니다.

시스템에서 리더로 선택되는 노드는 실패가 다른 리더를 선택할 때까지 리더십을 유지합니다.즉, 일단 리더십을 얻으면 나는 그것을 포기하고 싶지 않습니다.

큐레이터 리더 셀렉션 문서에 따르면, takeLeadership() 메소드가 반환 될 때 리더십이 포기됩니다.나는 그것을 피하고 싶다. 그리고 지금 당장 나는 대기 루프를 도입하여 돌아 오는 것을 막는다.

내 질문은 다음과 같습니다.

  1. 리더십을 구현하는 올바른 방법은 무엇입니까?
  2. 은 대기 루프 (아래의 코드 예제에서 볼 수 있듯이)

    를 차단하는 올바른 방법입니다.
    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();
            }
          }
        }
      }
    }
    
도움이 되었습니까?

해결책

대기자의 LeaderLatchInstead (), 할 수 있습니다 :

Thread.currentThread().join();
.

그러나 예, 정확합니다.

btw - 다른 방법을 선호하는 경우 리더 레이lAtceReener와 LeaderLatch를 사용할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top