3

私が開発しているシステムには、中央サーバーを定期的に更新する必要のある非常に多くのクライアント(たとえば、100万)が存在する可能性があります。クライアントはJavaで書かれています。

特定のユースケースは、サーバーバックエンドがクライアントへのIPアドレスの最新のマッピングを持っている必要があるということです。ただし、クライアントIPは動的であり、(事実上ランダムに)変更される可能性があります。

私が考えている解決策では、クライアントがサーバーにpingを実行してIPを更新する必要があります。期間は理想的には1分に1回である必要がありますが、1 ping/10分でも許容されます。

私の質問、順番に:

  1. 1分あたり1Mのpingは10k/秒を超えています。 したがって、最初に、このような負荷を処理するためにアプローチを拡張できることを知りたいと思います。 これは、利用可能なオプションを知るためです。

  2. 複数の解決策を念頭に置いていると仮定すると、これらのうちどれが最も経済的でしょうか? 費用対効果は非常に重要です。ネット上に独自のデータセンターや静的でファットなエンドポイントがないため、サーバーアプリケーションは、ある種のプロバイダーで実行するか、最終的にはクラウドで実行する必要があります。

ノート:

  • 自分のISPが提供する接続を使用して自宅からサーバーを実行することを検討しましたが、パフォーマンスの問題も、ISPがpingの絶え間ないストリームについてどう考えるかについても確信がありません。

  • サーバーがこれらのIP変更を自動検出する方法がわかりません。

4

6 に答える 6

2

たぶんあなたはその目的のためのプロトコルとしてSIPを使うことができますか?おそらく、JavaSIPLibsはすでに問題を解決しています。

ちなみに素敵なアプリ。

于 2012-04-18T20:25:54.820 に答える
2

エリック、あなたの問題は、それが聞こえるようにされたように見えるよりもはるかに単純です。

この問題は10年、おそらく2年前から存在していました。ここで車輪の再発明をする必要はありません。

ポーリング/pingが悪いアイデアである理由

ISPが提供する動的IPのリース時間は変動する可能性がありますが、多くの場合、少なくとも24〜72時間かかります。1〜10 mごとにサーバーにpingを実行すると、リソースが大量に発生し、72時間でクライアントごとに4,320を超える無駄なHTTPリクエストが発生する可能性があります。各リクエストは約300バイト*4,320の無駄なhttpリクエストは、1.3MBの無駄な帯域幅に100万クライアントのターゲットクライアント数を掛けたものに相当します。毎月の無駄な帯域幅は約1.2TBです。これは無駄な帯域幅であり、アプリを実行して有用な情報を提供するために必要な他の帯域幅ではありません。

クライアントは、頻繁にpingを実行するよりも賢くする必要があります。むしろ、起動時にIPアドレスがDNSと一致するかどうかを確認し、IPが変更された場合にのみ、サーバーに通知を送信できるようにする必要があります。これにより、帯域幅とサーバーの処理要件が数千倍削減されます。

あなたが説明しているのはダイナミックDNSです

あなたが話しているのは「ダイナミックDNS」(テクノロジーの説明的な名前であり、SaaSソリューションを提供する1つの会社の名前でもあります)です。

ダイナミックDNSは、名前とIPアドレスの間のマッピングを非常に迅速に変更できるDNSサーバーです。通常、これは動的IPのみを提供するISPを使用するデバイスに役立ちます。動的IP上のルーター/サーバーのIPが変更されるたびに、動的DNSサーバーに変更が通知されます。

  • ダイナミックDNSのデファクトスタンダードプロトコルは十分に文書化されています。ここから始めてください:DNS Update API、あなたが探している詳細はここにあると思います:DynDNSPerformUpdate。ルーターのハードウェアには通常、誰もが使用したいDynDNSクライアントが組み込まれているため、ほとんどの商用実装は同じプロトコルに非常に近いものです。
  • ほとんどのルーター(安価なルーターでも)には、すでにダイナミックDNSクライアントが組み込まれています。(独自のソフトクライアントを作成することもできますが、クライアントはプライベートIPでNAT処理される可能性が高いため、ルーターが最も効率的な場所である可能性があります。それでも可能ですが、パブリックIP検出の帯域幅が増えます。 )。
  • 「ダイナミックDNSjavaクライアント」をグーグルですばやく検索すると、次のような完全なソースプロジェクトが表示されます。JavaDynDNSクライアント(テストされていない、検索の能力を示しているだけです)

システムアーキテクチャに関するその他の考慮事項

IPクライアントマッピングが解決されたとしましょう。あなたはそれをすべて理解し、それは完璧に機能します、あなたは常に各クライアントのIPを知っています。次に、モバイルデバイスからクライアントにファイルを転送するための信頼性の高いシステムがありますか?私はノーと言うでしょう。

モバイルと家庭用コンピュータの両方で、Wi-Fi、セルラーデータ、場合によっては有線データなど、複数の接続タイプを使用できます。これらの各ネットワークには、異なるセキュリティシステムが導入されている場合があります。したがって、セルラーデータモバイルからホームルーターの背後にあるwifiラップトップへの接続は、同じwifiネットワーク上のラップトップに接続するwifiモバイルデバイスとは大きく異なります。

対処する物理ルーターファイアウォールがある場合があります。また、家庭用コンピュータでは、Windowsファイアウォールが有効になっている場合があります。ノートンインターネットセキュリティ、symantec、AVG、ゾーンアラームなどです。これらすべての潜在的なクライアントに対するファイアウォールの考慮事項を知っていますか?

于 2012-04-22T16:58:27.463 に答える
1

Javaプログラムを微調整して、IPの変更を認識してから、Webサービスにのみアクセスすることをお勧めします。

あなたはそれを次のように行うことができます、

  1. Javaプログラムの開始時に、マシンのIPを抽出し、グローバル変数またはより適切なプロパティファイルに保存します。
  2. 30秒/1分ごとにIPの変更をチェックするバッチプロセス/スケジューラを実行します。JavaQuartzSchedulerは非常に便利です。
  3. IPが変更された場合は、Webサービスを呼び出します。

このようにして、サーバーの役割が減り、トラフィックと接続が減ります。

于 2012-04-20T21:09:09.743 に答える
1

たとえば、XMLベースのUDPの上に独自のプロトコルを作成できます。3つのメッセージを定義します。

  • request-クライアントがサーバーにチャレンジをリクエストします
  • チャレンジ-サーバーはチャレンジで応答します(基本的には乱数)
  • 応答-クライアントはユーザー名とハッシュ化されたパスワード+チャレンジをサーバーに送り返します

軽量で交通量も多くありません。任意のレイヤーまたはロードバランサーを使用して、複数のサーバーに負荷分散できます。

C / C ++でサーバー側を実行する場合、平均的なPCは1分あたり数百万のそのようなヒットを処理できます(Javaネットワークのパフォーマンスについてはわかりません)

于 2012-04-22T14:41:54.813 に答える
0

no-ipの仕組みをご覧ください。あなたの要件はそれがすることとまったく同じです。

于 2012-04-22T06:35:54.987 に答える
0

ユースケースは正しいですか?ユーザーのコミュニティはすべて、お互いから写真を受け取りたいですか?サーバー上で画像をホストするのではなく、すべてのユーザーに直接ブロードキャストしますか?

ここに2つの質問があります。最初の質問は、「自分のWANIPアドレスが変更されたかどうかを知る方法」です。

NATを使用していない場合は、次のようにします。

InetAddress.getLocalHost()

あなたのIPアドレスを教えてくれます。

NATを使用している場合は、ダイナミックDNSを使用して独自のホスト名を解決することができます。

2番目の質問は、「インターネットを行き来するホスト間で写真を共有する方法」のようなものです。

可能なソリューションスペースは次のとおりです。

IPマルチキャスト。おそらく、前方誤り訂正とカルーセルを使用します(例:FLUTE)。

ファイルスウォーミング-例:bittorrent。

Jabber、AMQP、JMS、STOMPなどを使用したパブリッシュ/サブスクライブメッセージバスソリューション。適切な実装には、RabbitMQ、ActiveMQなどが含まれます。ここでは、JMSトピックが重要な概念です。

このソリューションは、IPレベルで物事を行うことによる大きなオーバーヘッドを回避する必要があります。

于 2012-04-22T07:48:10.660 に答える