2

それぞれの 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メカニズム以外に解決策はありますか?

4

2 に答える 2

1

別の解決策は、現在実行中のすべてのタスクを含むディレクトリを作成することです。ノード A がタスク T の実行を終了すると、ノード B はすでにタスク T の実行を開始しています。ここでできることは、ノード B を強制終了し、ノード A によって生成されたすべての変更をコミットすることです。これは、投機的実行の原則のバリエーションです。ノード B を強制終了するか、ノード A がタスクを正常に実行できた場合は、このノードによって行われたすべての変更を破棄できます。

于 2015-07-26T00:01:33.660 に答える
0

より高いセッション タイムアウトを設定すると、B によって作成されたエフェメラル ノードは削除されず、B はタスクを実行しません。

具体的には、

  • スレッドがタスクを実行するのにかかる最大時間がわかっている場合は、その最大時間をセッション タイムアウトとして設定します。
  • それ以外の場合は、平均実行時間、p-90、またはその他のヒューリスティックに基づいてタイムアウトを決定します
于 2015-07-23T20:28:22.960 に答える