在手机 APP 初始化配置了域名 A 和域名 B ,如果域名 A 访问慢,切换到域名 B 访问,我们是根据 ping 值,或者无法访问作为一个判断的依据。
这样有没有问题,请教诸位大神,或者有更好的思路不吝赐教。

500 就切换,以防万一逻辑可以做在客户端,再另外配置域名拉域名名单,每个域名再配置拉最新名单

这个不是应该在 dns 负载那头动脑筋嘛?

就像楼上说的 dns 负载均衡,或者你分区域分运营商解析。
要么直接用 cdn 。
不过你这访问响应,能根据用户的 ping 值?

直接用腾讯云 DNS 解析,付费就能开通 IGTM 做故障监测自动切换,不需要理解高深的 HA 架构、不需要改动代码解决。

这个有点类似翻墙软件的负载均衡,选择最快的节点,可以定时检测,使用一条 URL 检查响应时间

根据 ping 值切换是不是有些草率了?

可以用一个简单接口代替 ping ,其他都没有问题

各位,关键问题是 A 域名是天朝,B 域名是某国,这些都无效,这些 DNS 可能无法用上

你服务器 ip 和域名无关。
你分区域解析,不就行了。
难道你以为同一服务器,绑定不同国别域名,访问速度就会不一样?

如果你是个正经的 app ,就不要在国内上架能访问海外的,反之亦然

搞个小文件放到两个域名,客户端在网络切换或者其他有必要的场景下,去下载文件竞速,选择更快的域名

正统的做法是用一个域名做智能 dns ,国内用户返回国内 ip ,国外用户返回国外 ip 。

如果你要做竞速,建议别用 ping ,直接用 tcp/https 发起第一个请求,看哪个请求先有回复就用哪个。因为有些网络环境(例如 fakeip )是没法 ping 的。

楼上正解,智能 DNS

接#12 为什么不要用 ping ,因为有些网络环境,例如 fakeip 环境解析出的 ip 地址是假 ip (常见 198.18.x.x ),ping 是毫无意义的,另外某些网络防火墙可能会屏蔽 icmp 或者 tcp 包,出现 ping 不通但 tcp 通 或者 ping 通但是 tcp 不通的情况。

如果你需要多服务器竞速,可以专门做一个 api 接口简单返回“OK”数据包,在 app 启动/网络切换/连接出错时,同时对多个服务器发起这个 api 请求,看哪个先返回就优先哪个。

用户的网络情况可能是很复杂的,即便是在没有防火墙的国家,也可能会遇到比如连接了需要登录的 Wi-Fi 之类的情况,所有域名解析都会被拦截并跳转到 Wi-Fi 登录页面,所以 ping 、tcp ping 、普通 http 请求都是不可靠的。

所以 #12/#14 正解,但是服务器竞速比较常用的方法是提供一个 http 的 /generate_204 接口(/generate_204 属于事实上的标准,虽然没有定义标准,但大部分网站选择遵守),这个接口没有任何逻辑,仅返回 HTTP 状态码 204 ,且没有 body 。业务需要判断接口返回的状态码是 204 而非其他。
在 /generate_204 正常返回之前,都属于网络未连接的状态,应当以一定时间间隔(通常时间间隔越来越大)重试,直到最先返回的就是最快的。后续定期检查更新网络状态。

谢谢各位 V 友的解答,各位新年快乐!

而且手机似乎会在网络变化 dns 服务器变更的时候 dns 记录自动失效,已经建立的连接也会断开,这样分区解析会自动更新,毕竟手机是移动的

一般来说,负载均衡是优先在服务器侧做的,对外入口是负载均衡网关,网关做健康监测和转发。
在此之上客户端做的是 fallback ,这个一般用连接超时和响应异常,不推荐用 ping ( icmp echo ),而且很多环境只管 tcp udp 能不能通的。

参考 bilibili 请求一个接口,返回这个地域可用的 api ip 即可。。

bilibili 很多接口都没 https 直接抓包能看到不少东西

{
"dns":[
{
"host":"app.bilibili.com",
"client_ip":"58.19.1.96",
"ips":[
"221.15.71.67",
"221.15.71.66",
"221.15.71.65",
"61.240.206.10",
"221.15.71.64",
"61.240.206.13",
"112.83.140.13",
"112.83.140.12",
"61.240.206.11",
"61.240.206.12",
"112.83.140.11",
"112.83.140.14"
],
"type":1,
"ttl":52,
"origin_ttl":90
}
]

这是 bilibili 请求

203.107.1.34:80/191607/resolve?host=app.bilibili.com&query=4

你说他是怎么做的?。特殊地区返回特殊 ip