我创建了一个 Curator 客户端,如下所示:
RetryPolicy retryPolicy = new RetryNTimes(3, 1000);
CuratorFramework client = CuratorFrameworkFactory.newClient(zkConnectString,
15000, // sessionTimeoutMs
15000, // connectionTimeoutMs
retryPolicy);
在运行我的客户端程序时,我通过关闭 Curator 用来与 Zookeeper 通信的 NIC 来模拟网络分区。根据我看到的行为,我有几个问题:
ConnectionStateManager - State change: SUSPENDED
我在 10 秒后看到一条消息。直到 Curator 进入 SUSPENDED 状态的时间量是可配置的,基于其他超时值的百分比,还是总是 10 秒?- 自上次成功的检测信号后,配置的 15 秒会话超时后,我没有收到任何通知。我确实在日志中看到了一条
ZooKeeper - Session: 0x14adf3f01ef0001 closed
消息,但这似乎并没有作为我可以捕获或侦听的事件来传播。我在这里错过了什么吗? ConnectionStateManager - State change: LOST
我最终在连接丢失近两分钟后收到一条消息。为什么这么长?- 如果我的目标是在 HA 场景中使用 InterProcessMutex 作为防止脑裂的手段,似乎最安全的方法是让锁持有者在
SUSPENDED
收到消息时假设它已经丢失了锁,因为它完全是Zookeeper 可能在网络分区的另一端释放了它不知道的锁。这是一种典型/理智的方法吗?