2012-02-08 2 views
4

私は、世界中の多くの場所で(たとえばAWSを使用して)サーバーを動的に起動したり閉じる必要があるサービスを構築しています。ユーザーが自分のドメインにアクセスすると、待ち時間が最も短いローカルサーバーに割り当てる必要があります。特定のクライアント(ブラウザ)を多数のサーバーの1つに動的に割り当てる方法は?

たとえば、クライアントがexample.com/getDataにajaxを呼び出すと、割り当てられている特定のサーバーに直接移動する必要があります。異なるサーバーでは異なる計算が行われるため、一般的な負荷分散を行うだけでは不十分です。

どのような一般的なメカニズム/技術を使用すれば1)特定のクライアントと管理下の任意のサーバーとの間の待ち時間を評価できますか? 2)特定のクライアントを特定のサーバーに割り当てますか?私はjavascriptにはドメイン名ベースの制限があるので、例えばIPアドレスだけを使うことはできません。

おかげ

+0

一般的なシナリオを説明するユースケースや詳細を追加すると役立ちます。ポップアップする最初の事は多分最初のネゴシエーションあたりの特定のサーバーへのリクエスト/接続をリダイレクトサービスと統合され、「スマート」ロードバランサ、です。 – EdwardH

答えて

2

注:私は、応答内のすべての技術をリンクするのに十分な評判を持っていないので、時にはあなたはプレーンテキストでコピーしたリンクが表示されます。

1)レイテンシが最も低いローカルサーバーにユーザーを割り当てることは、必ずしも可能ではありません。

ユーザーに地理的に最も近いサーバーが、予期せず最も待ち時間の長いサーバーになることがあります。

(実行中の)サーバーとユーザー間の待ち時間を最小限に抑えることは簡単ではありません。 クライアントとサーバーの間にはさまざまなホップ(ルーター)が存在する可能性があり、いつでも問題、ルート更新、パケット輻輳などが発生する可能性があります。 遅延を評価する最も簡単な方法はpingですが、ファイアウォールがこれをブロックしている可能性があります。

だから、これを達成するための最良の方法は、anycast

すべての主要なCDNプロバイダは、このメソッドを実装して使用することです。いくつかは、推奨されていないと思われるTCPエニキャストと、他のUDPエニーキャストを使用するものがあります。それはオープンな議論です。

とにかく、エニーキャストを実装するためには、ISPルーターとピアリングできる必要があります。通常、これは不可能です。さらに、良いピアと悪いピアがあります。 最後に、ルーティングプロトコルとTCP/IPスタックに関する深い知識が必要です。

GEO-IPパッチでBINDを使用すると、すばやく簡単な解決策が得られる可能性があります。 したがって、国ごとに特定のDNSクエリー応答を定義できます。 たとえば、英国と米国のサーバーがある場合、ヨーロッパから来るユーザーに応答してBINDを構成して、英国のサーバーと米国のユーザーが米国のサーバーにアクセスするように構成できます。

2)特定のクライアントを特定のサーバーに割り当てるには、ポイント1で説明した手法を使用するか、プロキシおよびスティッキセッションを使用できます。 これを実現するには、HAプロキシが優れた製品です。 (URL:xy.1wt.eu)

3)ポイント1を使用すると、クロスドメインajax呼び出しで問題は発生しません。実際、それはクライアントにとって完全に透明です。たとえば、同じドメインexample.comの場合、米国から来るユーザーは1.1.1.1に解決しますが、ドイツから来るユーザーはexample.comを2.2.2.2に解決します(IPアドレスは偽装され、例として使用されます)。

クロスドメインのajax呼び出しを行うソリューションは、POSTのサポートの欠如のようないくつかの欠点があるJSON-Pです。私があなただったら、それは一度に3つのすべての問題を解決するため

私は、BINDとGEO-IPとなるだろう。地理的に最も近いサーバーが待ち時間の最も短いサーバーであるとは必ずしも言えないため、レイテンシの一部です。

関連する問題