0

マシン A はマシン B にメッセージを送信する必要があります。マシン A には静的 IP がありますが、マシン B にはありません。

この問題を解決するために考えられる 1 つのオプションは、マシン B がマシン A への TCP 接続を開き、マシン A がデータ/メッセージをマシン B に送信することです。ただし、この解決策には次の制限があります。

a) マシン B のようにデータの送信先のマシンが多数ある場合、スケーラブルではありません。マシン A のリソースを奪う可能性があります。

b) 必要なときにデータを送信する必要があるのはマシン A です。マシン B は、そのデータがいつ存在するかを知りません。現在の設計では、マシン B は、データがあるかどうかを尋ねる TCP 接続を使用して、マシン A を繰り返しポーリングし続ける必要があります。多くのマシン B がある場合、これは高くつく可能性があります。

この問題を解決する安価な方法はありますか? オブザーバーのデザインパターンが思い浮かびます。マシン B は、マシン A からの通知にサブスクライブして、データが利用可能になったときに通知することができます。しかし、マシン B が静的 IP を持っていない場合、分散環境でパターンをどのように実装するのでしょうか?

オブザーバーはさておき、マシン A の raw ソケットを使用してそのデータをマシン B に送信する以外に、コストがかからない方法はありますか?

4

4 に答える 4

1

IPマルチキャストを見てください。ただし、単純なUDPブロードキャストでうまくいく可能性があります。

于 2009-09-09T20:55:24.243 に答える
1

マシン B がマシン A を呼び出して、更新用の IP アドレスを登録するとどうなるでしょうか? それは迅速なメッセージ交換になります。マシン A にデータがあるときはいつでも、登録済みのすべての IP への新しい接続を作成し、それらにデータを送信できます。

于 2009-09-09T20:42:17.217 に答える
0

ポーリングする必要がないことを除いて、私はあなたの元のアイデアを採用します-Bは常にAへのアイドル状態のTCP接続を維持でき、Aがメッセージを送信したい場合は、メッセージをすべてのクライアントに送信しますその時に接続されました。オーバーヘッドは問題になりません-かなり古いマシンでさえ、何千もの同時のほとんどアイドル状態のTCP接続を処理できます。

(実際のメッセージ間のギャップが数分より長い場合は、Bが接続の切断をすばやく検出して再接続し、接続を回避できるように、ある種のキープアライブエコー/エコー応答タイプのメッセージも実装する必要があります-タイムアウトからのパスにあるファイアウォールまたはルーターの追跡情報)。

于 2009-09-10T22:22:26.910 に答える
0

静的 IP を持たないということは、外部からアクセスできることを意味しますが、それはアドレスの変更ですか?

A.detach(old_ip); A.attach(new_ip)その場合、アドレスが変更されるたびにマシン B を呼び出すことができます。

于 2009-09-09T20:43:55.673 に答える