2011-06-22 11 views
1

私は概念の面で非常に理解しやすいものを達成しようとしています。私は別のマシン間でJavaコードのブロックを同期したい。同時に実行できない異なるマシンで実行されるプログラムの2つのインスタンスがあります。分散同期実行

私はzookeeper、jgroups、akkaについても聞いたことがありますが、ドキュメントを読んでいるうちに私がやろうとしていることが少し残酷に思えました。もっと真っ直ぐなものがあれば誰にも分かりますか?

事前のおかげで、

ルイ

+0

"同時に実行できない異なるマシンで動作するプログラムのインスタンスが2つあります。"これら2つのプログラムのコーディネーターは、これらのプログラムの実行に関する状態を保存しなければなりません。この目的にはどのようなオプションがありますか? –

+0

私はその質問を理解するのをやめていません。私は、実行中のインスタンスの状態について心配していません。私は彼らが同時にデータを処理しないことを心配しています。 – rpvilao

+0

プロセスが同時にデータを処理しているかどうかを心配する場合は、プロセスの状態をコーディネーターに反映できる通信プロトコルが必要です。または、コーディネーターは、この情報のプロセスを要求することなくこれを判断することができなければなりません。コーディネーターはこの情報をどこかに保管する必要があります。どちらの場合でも、同期を担当するコーディネータは、システム全体に関する同期状態を保存する必要があります。 OS、JVMなどは、セマフォ、mutexなどの使用状況を追跡し、この情報を格納することでこれを行います。 –

答えて

3

私はHazelcastの分散ロック(http://docs.hazelcast.org/docs/3.6/manual/html-single/index.html#lock)が役立つと思います。ヘーゼルキャストは比較的軽量ですので、うまくいけば過度のものではありません。

+0

私はあなたのソリューションが私がやろうとしていることに合っていると信じています。 – rpvilao

3

あなたが言及したすべての技術は(もTerracottaを見てみましょう)した場合は、おそらく単純なデータベースのロックニーズのためにあまりにも洗練されていますか?

SELECT FOR UPDATEステートメントは、指定されたデータベースレコードをロックし、このクエリを実行している他のクライアントをブロックします。シンプルで安全です。

+0

私はそれを考えました。良いアプローチだと思われる。単一の障害点です。とにかく入力に感謝します。 – rpvilao

+0

@rpvilao - @VineetReynoldsのように、高可用性などの追加要件がある場合は、質問を明確にする必要があります。仕様によっては、ソリューションが単純すぎることもあれば、過剰なものがあることもあります。おかげさまで – manku

2

非常に非常に基本的な解決策は、RMIを使用します。

mutexロックを使用するメソッドを持つ1台のマシンをマスターとして使用することを決定し、1つのmthod呼び出し側が通過することを許可します。

特別なJavaコードブロックを実行する前に、この特殊なメソッドを他のすべてのスレーブインスタンスからRMI経由で呼び出す必要があります。

関連する問題