This is a serious question and a real problem. It isn't, however, imposed
by ZK. You have to have a clean strategy for loss of coordination in your
application if you want it to be robust.
I have seen various strategies work reasonably well. The approach used in
Katta is to build a listener abstraction over the top of ZK. The central
object maintains a ZK reference and sends change events to a list of
listeners. This central object can handle the reconnection after expiration
and the dispatch of notifications to listeners. This is essentially what
you suggest except that the Zk reference is hidden away a bit. This can be
a bit dangerous if you hide too much of the ZK semantics, but it is not all
that bad if you leave some of those semantics intact. In particular, you
must not indiscriminantly do retries on failure since that can lead you into
really deep and murky waters very quickly.
On Sun, Jun 7, 2009 at 4:58 PM, Satish Bhatti <cthd2...@gmail.com> wrote:
> However, if receive
> a Watcher.Event.KeeperState.Expired event, a fresh ZooKeeper client
> has to be created. If I were sharing the ZooKeeper instance, then somehow
> my objects would have to be notified that they should switch to using the
> new ZooKeeper instance. That means somewhere in my app I would need to
> maintain a list of all objects using ZooKeeper. Is this the recommended
> approach? Is there some other more elegant way to do this?
Ted Dunning, CTO