4

我正在尝试在 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 就位后,一旦所有节点都加入,它总是会通过障碍。我确信同步处理方法可以解决这个问题,但事实并非如此。任何人都有这方面的经验,或者知道我可能做错了什么?

4

1 回答 1

4

您可以将您的实现与已经实现分布式屏障的netflix-curator进行比较。

于 2011-12-13T20:18:20.497 回答