隐藏通道
ZooKeeper客户端总是会观察到相同的更新顺序,即使它们连接到不同的服务端上。但是客户端可能是在不同时间观察到了更新,如果他们还在ZooKeeper以外通信,这种差异就会更加明显。让我们考虑以下场景:
- 客户端c1更新了/z节点的数据,并收到应答
-
客户端c1通过TCP的直接连接告知客户端c2,/z节点状态发生了变化
-
客户端c2读取/z节点的状态,但是在c1更新之前就观察到了这个状态
我们称之为隐藏通道(hiddenchannel),因为ZooKeeper并不知道客户端之间额外的通信。现在c2 获得了过期数据,图4-2描述了这种情况:
为了避免读取到过去的数据,我们建议应用程序使用ZooKeeper进行所有涉及ZooKeeper状态的通信。例如,为了避免刚刚描述的场景,c2 可以在/z节点设置监视点来代替从c1 直接接收消息,通过监视点,c2就可以知道/z节点的变化,从而消除隐藏通道的问题。
在这里Zookeeper提供了sync方法,该方法会刷新调用sync的服务端与群首之间的通道,这样就能获取所有的数据变化信息。使用方式如下:
try {
ZooKeeper zk = new ZooKeeper("127.0.0.1:2181", 3000, null);