【问题标题】:How to dynamically assign particular client (browser) to one of many servers?如何将特定客户端(浏览器)动态分配给众多服务器之一?
【发布时间】:2012-02-08 17:54:12
【问题描述】:

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

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

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

谢谢

【问题讨论】:

  • 如果您可以添加更多细节,或者更好的是描述常见场景的用例,这将有所帮助。弹出的第一件事是“智能”负载平衡器,可能与一个服务集成,该服务在初始协商时将请求/连接重定向到特定服务器。

标签: networking dns load-balancing latency


【解决方案1】:

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

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 地址是假的,仅用作示例)。

附带说明,进行跨域 ajax 调用的一种解决方案是 JSON-P,尽管它有一些缺点,例如缺乏对 POST 的支持。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 2018-03-04
    • 2016-04-10
    • 2011-10-15
    • 1970-01-01
    • 2017-01-03
    相关资源
    最近更新 更多