我正在编写一个使用 ZooKeeper 的应用程序,并且经常收到 CONNECTIONLOSS
事件。我使用 2000
作为我的刻度时间,12000
作为我的 session 超时,并且应用程序在 Amazon EC2 中运行。我相信在使用之前我正在等待 ZooKeeper 连接;这是我用来执行此操作的代码:
ZooKeeper zk=new ZooKeeper(connectionString, sessionTimeout, new Watcher() {
@SuppressWarnings("deprecation")
public void process(WatchedEvent event) {
switch(event.getState()) {
case SyncConnected:
case ConnectedReadOnly:
// We're connected, count down...
ready.countDown();
break;
case SaslAuthenticated:
// Life is good here. Nothing to do...
break;
case AuthFailed:
case Disconnected:
case Expired:
case NoSyncConnected:
case Unknown:
default:
LOGGER.error("ZooKeeper event: "+event.getState());
break;
}
}
});
boolean ok;
try {
ok = ready.await(15, TimeUnit.SECONDS);
}
catch(InterruptedException e) {
throw new InterruptedIOException();
}
if(ok == false)
throw new IOException("Failed to connect to ZooKeeper");
为什么 ZooKeeper 可能会收到这些虚假的 CONNECTIONLOSS
事件?
最佳答案
我们过去在 AWS 上运行时也遇到过类似的 ZK 问题。我们通过确保所有 EC2 实例都使用网络时间协议(protocol) (NTP) 运行来解决这些问题。如果您的实例存在时间偏差,这似乎会导致它们对超时感到困惑。
关于java - 频繁发生 ZooKeeper CONNECTIONLOSS 事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24685552/