disconf的Zookeeper异常考虑
==========

##disconf-web的ZK异常处理##

disconf-web可以完全保证在任何情况下，与ZK集群的自动连接。

下面按情况进行分析：

###服务启动前，zk连接不上：

- 开始连接不上：
    - apache ZK client自身会自动(永久）去连接ZK server. 但是一直连接不上。
    - 因此，web上所有操作均会失败，抛大异常，请求失败，只会重试一次，不会重试多次
- 后面突然连接上了：
    - apache ZK client 收到server SyncConnected消息。
    - 这时所有操作均成功
- 后面又突然连接不上了：
    - apache ZK client 收到server Disconnected 消息。 
    - 这时，apache ZK client自身会自动(永久）去连接ZK server. 但是一直连接不上。
    - 这时 web 上 所有操作均会失败，抛大异常，请求失败，只会重试一次，不会重试多次
- 后面突然连接上了：
    - apache ZK client 收到server Expired 消息。 
    - 这时表示会话丢失啦，apache ZK client 自动断开与Server的连接，表示此时让你来处理，因为它不知道应该如何处理。
    - 这时，disconf-core会reconnect zkserver，重新建立会话。
    - 成功后，apache ZK client 收到server SyncConnected 消息。表示连接成功
- 后面又突然连接不上了：
    - apache ZK client 收到server Disconnected 消息。 
    - 这时，apache ZK client自身会自动(永久）去连接ZK server. 但是一直连接不上。
    - 这时 web 上 所有操作均会失败，抛大异常，请求失败，只会重试一次，不会重试多次

###服务启动前，zk连接上了：

- 开始连接：
    - apache ZK client 收到server SyncConnected消息。
    - 这时所有操作均成功功
- 后面又突然连接不上了…… （与上面分析一样，此不再赘述）

###注意

ZK一般需要以集群的形式提供出来。假设有N台ZK，

- 只要至少有一台ZK存活，disconf-web就可以正常工作。而且永远不会收到 server Expired 的消息。
- 只要有一台ZK死亡，disconf-web就会收到 Disconnected 消息。但是系统仍可以继续工作。
- 如果所有zk都死亡，那么disconf-web会收到 Disconnected 消息。只要有一台存活，disconf-web就会收到 

##disconf-client的ZK异常处理##

disconf-client可以完全保证: **如果在启动程序时保证ZK集群是可用的**，那么，就可以保证在任何情况下，与ZK集群的自动连接。

下面按情况进行分析：

###程序启动前，zk连接不上：

这时disconf-client无法在ZK上注册信息。这是必须禁止发生的情况。也是disconf-client无法支持的情况。

一旦发生这种情况，请先恢复ZK集群，再启动你的程序。

###程序启动前，zk连接上了：

如果在程序启动过程中，ZK是正常的，那么，disconf-client可以保证与ZK连接的自动性。

- 只要集群有一台还存活着，你的程序配置还是受disconf托管。
- 如果集群所有机器均死亡，这时你的程序将游离于disconf之外。只要集群中有任何一台ZK机器重新开启，那么 你的程序将重新 由disconf进行托管。

###注意

disconf-client必须保证在程序在启动时，ZK集群的可用性。




