Реализация барьера Zookeeper - PullRequest
4 голосов
/ 26 июня 2011

Я пытаюсь установить барьер в Zookeeper.Моя реализация работает все время, когда существует небольшое количество узлов, которые необходимо соединить, чтобы преодолеть барьер.Однако, когда я тестирую свою реализацию с более чем 100 узлами, нуждающимися в присоединении к барьеру, примерно в 1% случаев кажется, что один из узлов пропускает последнее событие наблюдателя, и не проверяет, является ли количество дочерних элементовбарьерный узел изменился.

Я даже синхронизировал метод процесса на наблюдателе, но это ничего не изменило.Ниже приведен код для моего метода процесса и логика, которая проверяет, нужно ли двигаться вперед.

Процесс наблюдателя:

public BarrierWatcher(FastBarrier FastBarrier) {
      this.ofb = FastBarrier;
    }

    @Override
    public synchronized void process(WatchedEvent event) {
      synchronized (ofb) {
        ofb.notify();
      }
    }

Логика для управления механизмом барьера:

BarrierWatcher bw = new BarrierWatcher(this);
List<String> memberList = zk.getChildren(barrierPath, bw);
synchronized(this) {
  while (memberList.size() < numOfMembers) {
    this.wait(1000);
    memberList = zk.getChildren(barrierPath, bw);
    }
}

Вместо того, чтобы просто вызывать this.wait (), мне пришлось добавить this.wait (1000) для редкого сбоя.С 1000 на месте это всегда проходит барьер, как только все узлы присоединились.Я был уверен, что синхронизация метода процесса исправит это, но это не так.У кого-нибудь есть опыт с этим, или есть идеи, что я могу делать не так?

1 Ответ

3 голосов
/ 14 декабря 2011

Вы можете сравнить свою реализацию с netflix-куратором , где распределенный барьер уже реализован.

...