如何动态地将特定客户端(浏览器)分配给众多服务器之一?

时间:2012-02-08 17:54:13

标签: networking dns load-balancing latency

我正在构建一项服务,要求我在世界各地的许多地方动态启动和关闭服务器(例如使用AWS)。当用户访问我的域时,他们需要被分配到具有最低延迟的本地服务器。

通过赋值,我的意思是例如客户端对example.com/getData进行ajax调用,它应该直接转到已分配给的一个特定服务器。不同的服务器将进行不同的计算,因此仅具有某种一般的负载平衡是不够的。

哪些通用机制/技术可以让我1)评估特定客户端和我控制下的任何服务器之间的延迟? 2)将特定客户端分配给特定服务器?我不能仅使用IP地址,因为javascript具有基于域名的限制。

由于

1 个答案:

答案 0 :(得分:2)

注意:我没有足够的声誉来链接响应中的所有技术,因此有时您会看到以纯文本格式复制的链接。

1)并非总能将用户分配到具有最低延迟的本地服务器。

有时,地理位置最接近用户的服务器出乎意料地是具有最高延迟的服务器。

要找到(运行中)服务器与用户之间的最低延迟并非易事。 客户端和服务器之间可能存在许多不同的跳(路由器),并且它们中的任何一个都可能出现问题,路由更新,数据包拥塞等。 评估延迟的最快方法是ping,但可能是防火墙阻止了这一点。

因此,实现此目标的最佳方法是使用anycast

所有主要的CDN提供商都实施此方法。有些人使用似乎不推荐的TCP任播,以及其他UDP任播。这是一场公开辩论。

无论如何,为了实现任播,您需要能够与ISP路由器对等,通常这是不可能的。此外,还有好的同行和坏的同行。 最后,所有这些都需要深入了解路由协议和TCP / IP堆栈。

快速而肮脏的解决方案可能是将BIND与GEO-IP补丁一起使用。 因此,您可以定义每个国家/地区的特定DNS查询响应。 我的意思是,例如,如果您在英国有一台服务器而在美国有一台服务器,您可以配置BIND以响应来自欧洲的用户访问英国服务器以及来自美国的用户访问美国服务器。

2)要将特定客户端分配给特定服务器,您可以使用我在第1点中描述的技术,或者您可以使用代理和粘性会话。 HA-Proxy是实现这一目标的好产品。 (网址:xy.1wt.eu)

3)如果你使用第1点,你就不会遇到跨域ajax调用的问题。事实上,它对客户来说是完全透明的。例如,对于同一域example.com,来自美国的用户将其解析为1.1.1.1,而来自德国的用户将解析example.com至2.2.2.2(IP地址是假的,仅用作示例)。 / p>

另一方面,做跨域ajax调用的解决方案是JSON-P,虽然有一些缺点,比如缺乏对POST的支持。

如果我是你,我会选择BIND和GEO-IP,因为它可以一次解决所有三个问题。 (延迟的一部分因为地理上最接近的服务器是具有最低延迟的服务器并不总是如此。)