5

元の投稿

分散リモート メソッド呼び出しシステムを実装するにはどうすればよいですか?

次のようなものを作成しようとしています。

  • 個々の「ホスト」を追跡するためのマスター サーバー。
  • ホストは、プロキシ オブジェクト インターフェイス ベースのプログラミング スタイルを使用して、ネットワーク上の他のホストと通信できます。次に例を示します。var result = remoteHost.MyMethod(5);

SuperPoolScsなどの RMI ライブラリを使用してみましたが、いくつかの基本的な問題があります。

  • SCS は、サーバー --> クライアントまたはクライアント --> サーバー通信のみをサポートし、クライアント --> クライアント通信はサポートしません。
  • 私が知る限り、SuperPool は同じものしかサポートしていませんが、この図はそうでないことを示唆していますが、これを行う方法に関するドキュメントには何も見つかりません。 ここに画像の説明を入力

違いは、クライアント -> サーバーまたはサーバー -> クライアントのみの通信ではなく、クライアント上の任意のコンポーネントが他のクライアント上のコンポーネントとも通信できることです。

これをどのように実装することをお勧めしますか (おそらくこれらの既存のソリューションをベースとして使用します)、または機能する可能性のある他の既存のソリューションはありますか?

より広範な例

これが私がやろうとしていることの図です: ここに画像の説明を入力

重要な注意:クライアントは互いに接続しません。

プロセス:

  1. Client1 がサーバーに接続します
  2. Client2 がサーバーに接続します
  3. Client1 は、Client2 のコンポーネントがサーバー、別のクライアント、またはそれ自体に存在するかどうかを知らずに、Client2 のメソッドを呼び出します。

アイデアは、2 番目のクライアントでメソッドを呼び出すためのクライアント --> サーバー --> クライアント通信パスを許可することを除いて、SuperPool が行ったことと同じです。

4

2 に答える 2

3

ZeroMQは非常に低レベルですが、双方向通信をサポートし、 .NET をサポートしており、nuget.org で入手できます

DEALER/ROUTER または DEALER/DEALER ソケット ペアで多数の双方向会話を多重化でき、どちらの側からも会話を開始できます。

ただし、ZeroMQ には、メソッド呼び出しを行う準備がすべて整っているわけではないことに注意してください。独自のプロトコルを作成するか、既存のプロトコルを使用して実装する必要があります。

ZeroMQ の上に構築されたSalt と Cloudless の両方が、リモート メソッド呼び出しを提供します。

ZeroMQ は、非常に堅牢な非同期ソケット (およびその他) を容易にします。 メッセージのルーティングは絶対に可能です。ZeroMQ ガイドで Ventilator と Sinkを組み合わせると、 達成したいことに非常に近づきます。

実際のプロトコルとメソッドの呼び出しを実装する必要があることに注意してください。

于 2013-05-12T06:30:29.997 に答える
0

Superpool をざっと見てみると、考えられるすべてのタイプの通信をサポートしているように見えます。これはメッセージ キュー上の RMI レイヤーであり、名前付きターゲットまたは (場合によっては複数の) 名前のないターゲットへの同期または非同期通信を可能にします。あなたのアーキテクチャが何であるかを本当に理解していないことを告白します。

Superpool の問題点は、.Net に閉じ込められることです。すべてのコンポーネントは .Net である必要があり、すべて Superpool を使用する必要があります。

コンポーネント間の分離された通信 (送信者が受信者を知る必要がないことを意味する分離) を処理する "標準的な" 方法は、すべてのコンポーネントをメッセージ バスに配置することです。@Erno de Weerd は、これを行うための 1 つの可能な方法である ZeroMQ を提案しました。より高いレベルのオプション (遅くなりますが) は、RabbitMQ や MSMQ などの本格的なメッセージ キュー サーバーを使用することです。

欠点は、スーパープール (または他の RMI ソリューション) の呼び出し構文が失われ、コンポーネントでメソッドを呼び出す代わりに、チャネルを介してメッセージをやり取りすることを考えなければならないことです。

于 2013-05-12T11:09:23.670 に答える