目录
场景
客户端:外网游戏玩家
服务端:外网游戏玩家直连服务。部署架构如下:
ServerA
/ | \
/ | \
LB1 LB2 LB3
\ | /
\ | /
ServerB
DNS: example.com –> IP1(LB1), IP2(LB2), IP3(LB3)
游戏客户端通过 example.com 访问服务,ServerA 和 ServerB 互备。
为了防止跨运营商网络故障及提升用户体验,三个 LB 分别对应移动、联通、电信。DNS 解析的目标是:移动用户返回移动的 LB, 联通的访问联通 LB, 因此类推,公司的 GSLB 系统实现了这一点。
问题
DNS server 返回一个 IP
按照上文的 DNS 配置,虽然一个域名配置了 3 个 IP, 但是为了实现就近接入,客户端每次域名解析实际上只返回一个 IP. 但是倘若访问的 LB 故障,那该客户端重试的机会都没有。
Note: 由于 DNS 是分级实现,且每一级都存在缓存,客户端是没办法做到短时间之内多次域名解析获取不同的 IP 的。
DNS server 返回多个 IP
如果一次解析返回多个 IP, 客户端逐个尝试是否可行?这样的确可以保证在不是所有节点都故障的情况下能连接成功,但是并不能保证就近接入。因为 DNS server 是没办法保证返回的 IP 的顺序的,这样就无法将就近网络的 IP 放在第一位。可以看一下 getaddrinfo()
的例子:
from optparse import OptionParser
import socket
import json