次のように 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
に、接続が失われてからほぼ 2 分後にメッセージを受け取ります。なぜそんなに長いのですか? SUSPENDED
私の目標が HA シナリオでスプリットブレインを防ぐ手段として InterProcessMutex を使用することである場合、最も安全なアプローチは、メッセージが受信されたときにロック所有者がロックを失ったと想定することです。ネットワーク パーティションの反対側で、Zookeeper が知らないうちにロックを解除した可能性があります。これは典型的な/健全なアプローチですか?