5. disconf的Zookeeper异常考虑

5.1. 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就会收到

5.2. 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集群的可用性。