Java - 分散プログラミング、RMI?
-
21-08-2019 - |
質問
ここでとんでもない問題が発生しました。さまざまな交通シミュレーション モデルの統合を可能にするフレームワークを構築することを目指しています。この統合は、シミュレーション間のリンク接続、リンク コスト、および車両の共有に基づいています。
分散シミュレーションを行うために、「コーディネーター」(スター型トポロジー) を用意する予定です。参加しているシミュレーションはすべて、それに登録するだけで、コーディネーターとのみ会話します。次に、コーディネーターは、各シミュレーション間のさまざまなタスクの実行を調整します。
分布の問題の簡単な例は、1 つのシミュレーションが道路などの特定のオブジェクトを「担当」する場合です。そしてもう一人は他の道路を「担当」しています。ただし、これらの道路は相互接続されています (したがって、これらのシミュレーション間の同期が必要であり、データを交換したりリモートでメソッドを呼び出したりできる必要があります)。
RMI を調べたところ、このタスクには RMI が適しているのではないかと考えています。(有線信号の規律を作成する必要性を抽象化するため)。
これは正気ですか?ここでの問題は、シミュレーション参加者が集中管理する必要があることです。 いくつかの シミュレーション間の明示的な同期を確保するために、「コーディネーター」内のデータ ストレージを管理します。さらに、一部のシミュレーションでは、他のシミュレーションのコンポーネントまたはメソッドが必要になる場合があります。(したがって、RMI を使用するという考えが生まれました)。
私の基本的なアプローチは、「コーディネーター」に巨大な RMI レジストリを実行させることです。また、すべてのシミュレーションではレジストリ内のすべてを単純に検索し、各ステップで正しいオブジェクトが使用されるようにします。
この道を進むためのヒントを持っている人はいますか?
解決
また、 Hazelcast にチェックアウトすることができます。 Hazelcastは、オープンソースのトランザクション、キュー、トピック、マップ、セット、リスト、ロックおよびエグゼキュータのサービスの分散/パーティション実装です。で動作する超簡単です。ちょうどあなたのクラスパスにhazelcast.jarを追加し、コーディングを開始。ほとんどの設定が必要になります。
あなたが分散的にあなたのRunnableを、呼び出し可能なタスクを実行することに興味がある場合は、、そして<のhref =「http://code.google.com/docreader/#p=hazelcast」で配布エグゼキュータ・サービスのドキュメントをご覧くださいREL = "noreferrer"> http://code.google.com/docreader/#p=hazelcast の
Hazelcast のApacheライセンスの下でリリースし、エンタープライズグレードのサポートも用意されている。
他のヒント
これは正気ですか?私見ではありません。その理由をお話します。ただし、最初に免責事項を付け加えておきます。これは複雑なトピックであるため、どのような回答もほんの表面をなぞったものと見なす必要があります。
まず、繰り返す代わりに次の点を指摘します。 Java グリッド/クラスター テクノロジの概要 少し前に書いたもの。ほぼ完全なリストです。
スター トポロジは、ポイントツーポイントがシンプルであり、主要なコントローラ ロジックの集中化もシンプルであるため、「素朴な」(悪い意味ではありません) 実装にとっては「自然」です。ただし、フォールトトレラントではありません。これにより、スケーラビリティの問題と単一のボトルネックが生じます。これにより、通信の非効率が生じます (つまり、ポイントはセンターを介した 2 段階のプロセスを介して通信します)。
これに本当に必要なのは、おそらく (データ/コンピューティング グリッドではなく) クラスター ソリューションです。 テラコッタ. 。理想的には、次のようになります オラクルのコヒーレンス しかし、(無料と比較して)高価であることは間違いありません。それにしても素晴らしい製品ですね。
これら 2 つの製品はさまざまな方法で使用できますが、どちらも中心となるのは、キャッシュを分散マップのように扱うことです。何かを入れたり、取り出したりして、キャッシュを変更するコードを実行します。この点に関しては、Coherence (私はこれに慣れています) が非常にうまく拡張できます。これらは、真のクラスターを対象とした、より「サーバー」ベースの製品です。
より分散されたモデルを検討している場合は、おそらく SOA ベースのアプローチを検討する必要があります。
その分散のJava VMを、それは、クラスタ化されているアプリケーションの利点は、標準のJavaアプリケーションよりも違って見えるしていない。
私はアプリケーションでそれを使用していると、速度はこれまでのところ非常に印象的です。
ポール
あなたは、メッセージキューのアプローチを使用して考えられていますか?あなたは/通信サーバ/ノードの集合間でタスクと結果を調整するためにJMSを使用することができます。あなたも、AmazonのSQS(簡易キューサービス:aws.amazon.com/sqs)を使用することができ、必要に応じて、あなたがスケールアップとダウンできるようにするためにEC2上で実行しているサーバーを持っている。
。ちょうど私の2セントます。
JINIを見てください、それはあなたにいくつかの使用であるかもしれない。
まあ、ジニ、またはより具体的にJavaSpacesの問題への簡単なアプローチを開始するには良い場所です。 JavaSpacesのは、あなたのマスター(あなたのケースでは、コーディネーターが)Javaspaceにタスクを書き込み、マスタ・ワーカモデル、およびのための労働者のクエリを実行すると、バックマスターのために結果を書いて、これらのタスクを処理することができます。あなたの問題はあきれるほど並列ではなく、あなたの労働者がデータを交換/同期する必要があるので、これはあなたのソリューションにいくつかの複雑さを追加します。
あなたの実装に全体の多くの抽象化を追加するのJavaSpacesを使って、その使用(内部的にデフォルトの「ワイヤプロトコル」としてJiniのフレームワークで使用される)、プレーンRMIます。
イントロのための日からこの記事のを見てください。
とJan Newmarchのジニチュートリアルにはジニの学習を開始するにはかなり良い場所です
ことを目的として、また、その他の答えとして見るかぎり、すべての注力グリッド、クラウドコンピューティングするシミュレーションモデルの一つの特徴:シミュレーション時間に
実行する場合として,分散シミュレーションモデルと並列に同期しい二つのオプション:
- それぞれのシミュレーションモデルはシミュレーションクロック、イベント一覧はこれらを同期化する必要がありますのネットワーク.
- もしあるシクロック、イベントリストである"目盛りの時間"のためのすべての分散型(字)モデルです。
最初のオプションが広く研究のための高レベル建築(HLA)を入手している。 http://en.wikipedia.org/wiki/IEEE_1516 としてスターター.
しかし、第二のオプションされてきていることからシンプルの少ないオーバーヘッドでした。