手机 APP 怎么做到动态切换域名?

33 天前
xhwdy26  xhwdy26

在手机 APP 初始化配置了域名 A 和域名 B ,如果域名 A 访问慢,切换到域名 B 访问,我们是根据 ping 值,或者无法访问作为一个判断的依据。

这样有没有问题,请教诸位大神,或者有更好的思路不吝赐教。

3442 次点击
所在节点   程序员  程序员
20 条回复
gaobh
gaobh
33 天前
500 就切换,以防万一逻辑可以做在客户端,再另外配置域名拉域名名单,每个域名再配置拉最新名单
eas
eas
33 天前
这个不是应该在 dns 负载那头动脑筋嘛?
tunggt
tunggt
33 天前
就像楼上说的 dns 负载均衡,或者你分区域分运营商解析。
要么直接用 cdn 。
不过你这访问响应,能根据用户的 ping 值?
GeekGao
GeekGao
33 天前
直接用腾讯云 DNS 解析,付费就能开通 IGTM 做故障监测自动切换,不需要理解高深的 HA 架构、不需要改动代码解决。
GG668v26Fd55CP5W
GG668v26Fd55CP5W
33 天前
这个有点类似翻墙软件的负载均衡,选择最快的节点,可以定时检测,使用一条 URL 检查响应时间
hefish
hefish
33 天前
根据 ping 值切换是不是有些草率了?
codegenerator
codegenerator
33 天前
可以用一个简单接口代替 ping ,其他都没有问题
xhwdy26
xhwdy26
33 天前
各位,关键问题是 A 域名是天朝,B 域名是某国,这些都无效,这些 DNS 可能无法用上
tunggt
tunggt
33 天前
@xhwdy26 你服务器 ip 和域名无关。
你分区域解析,不就行了。
难道你以为同一服务器,绑定不同国别域名,访问速度就会不一样?
ETiV
ETiV
33 天前
如果你是个正经的 app ,就不要在国内上架能访问海外的,反之亦然
hzplszl
hzplszl
33 天前
搞个小文件放到两个域名,客户端在网络切换或者其他有必要的场景下,去下载文件竞速,选择更快的域名
yinmin
yinmin
33 天前
正统的做法是用一个域名做智能 dns ,国内用户返回国内 ip ,国外用户返回国外 ip 。

如果你要做竞速,建议别用 ping ,直接用 tcp/https 发起第一个请求,看哪个请求先有回复就用哪个。因为有些网络环境(例如 fakeip )是没法 ping 的。
chi1st
chi1st
33 天前
楼上正解,智能 DNS
yinmin
yinmin
33 天前
接#12 为什么不要用 ping ,因为有些网络环境,例如 fakeip 环境解析出的 ip 地址是假 ip (常见 198.18.x.x ),ping 是毫无意义的,另外某些网络防火墙可能会屏蔽 icmp 或者 tcp 包,出现 ping 不通但 tcp 通 或者 ping 通但是 tcp 不通的情况。

如果你需要多服务器竞速,可以专门做一个 api 接口简单返回“OK”数据包,在 app 启动/网络切换/连接出错时,同时对多个服务器发起这个 api 请求,看哪个先返回就优先哪个。
jinliming2
jinliming2
32 天前
用户的网络情况可能是很复杂的,即便是在没有防火墙的国家,也可能会遇到比如连接了需要登录的 Wi-Fi 之类的情况,所有域名解析都会被拦截并跳转到 Wi-Fi 登录页面,所以 ping 、tcp ping 、普通 http 请求都是不可靠的。

所以 #12/#14 正解,但是服务器竞速比较常用的方法是提供一个 http 的 /generate_204 接口(/generate_204 属于事实上的标准,虽然没有定义标准,但大部分网站选择遵守),这个接口没有任何逻辑,仅返回 HTTP 状态码 204 ,且没有 body 。业务需要判断接口返回的状态码是 204 而非其他。
在 /generate_204 正常返回之前,都属于网络未连接的状态,应当以一定时间间隔(通常时间间隔越来越大)重试,直到最先返回的就是最快的。后续定期检查更新网络状态。
xhwdy26
xhwdy26
32 天前
谢谢各位 V 友的解答,各位新年快乐!
sujin190
sujin190
32 天前
@xhwdy26 而且手机似乎会在网络变化 dns 服务器变更的时候 dns 记录自动失效,已经建立的连接也会断开,这样分区解析会自动更新,毕竟手机是移动的
jim9606
jim9606
32 天前
一般来说,负载均衡是优先在服务器侧做的,对外入口是负载均衡网关,网关做健康监测和转发。
在此之上客户端做的是 fallback ,这个一般用连接超时和响应异常,不推荐用 ping ( icmp echo ),而且很多环境只管 tcp udp 能不能通的。
jeesk
jeesk
31 天前
参考 bilibili 请求一个接口,返回这个地域可用的 api ip 即可。。

bilibili 很多接口都没 https 直接抓包能看到不少东西
jeesk
31 天前
{
"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 请求

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

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

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1108484

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX