それぞれの JVM (ノード A と B など) で 2 つのプロセスを実行しています。単一の ZooKeeper サーバーに接続して、タスクの実行を調整します。ノードのどちらか (A または B) がscheduled task (freq 1 minute)
一度に実行する必要があります。両方ではありません。また、A が失敗した場合、B が次のスケジュールされた時間にタスクの実行を引き継ぐ必要があります。
以下は問題です:
ノード A は競争に勝ち、ZooKeeper にエフェメラル ノードを作成して、タスクの実行を開始したことを示します。A がタスクの実行を開始すると、ZooKeeper との接続が失われるため、ZooKeeper はしばらくしてエフェメラル ノードを削除します。データのサイズが予想外に大きかったため、実行が 1 分の境界を超えました。B が起動すると、A が以前に作成したエフェメラル ノードは表示されません。そのノードがない場合、B は他のノードがタスクを実行していないと見なし、A と並行してタスクの実行を開始しますがdisconnected
、これは誤りです。A または B のいずれかがタスクを実行する必要があります。
私は、A が ZooKeeper に接続されていない場合でも開始されたタスクを完了し、A がタスクを完了するまで B を並行して実行しないことを好みます。
org.I0Itec.zkclient.ZkClient
クライアント ライブラリを使用しています。カスタムheartbeat
メカニズム以外に解決策はありますか?