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

标签 networking dns load-balancing latency

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

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

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

谢谢

最佳答案

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

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

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

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

所以最好的方法是使用 anycast

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

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

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

2) 要将特定客户端分配给特定服务器,您可以使用我在第 1 点中描述的技术,或者您可以使用代理和粘性 session 。
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,因为它可以一次性解决所有三个问题。 (延迟的一部分,因为地理位置最近的服务器并不总是延迟最低的服务器。)

关于networking - 如何将特定客户端(浏览器)动态分配给众多服务器之一?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9198788/

相关文章:

ios - 将图像转换为文本的最优化方式

java - Java中TCP连接过程中检测、预防和管理错误的方法有哪些?

apache2 - 带有主动/被动设置的 Apache HTTPD mod_proxy_balancer

rest - Rest API 调用的粘性 session

linux - 如何循环直到 IP :port is not responding

macos - 如何判断 OS X 上是否存在事件的网络连接?

networking - 如何将Docker容器隐藏在单个主机名后面

apache - 如何在 ubuntu 上使用 apache 正确设置网站和域(带有子域)?

heroku - 将 cPanel 根域指向 Netlify

apache - 在 Apache 访问日志中获取工作人员名称