V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
cdring
V2EX  ›  程序员

请教多域名请求问题

  •  
  •   cdring · 2024-10-25 14:06:29 +08:00 · 4125 次点击
    这是一个创建于 365 天前的主题,其中的信息可能已经有所发展或是发生改变。
    各位大神,后台 api 配置了多个域名。前端如何检测这些域名,哪个延迟低拿哪个域名请求后端 api 。这多个域名是存数据库后端返回给前端。还是直接写到 json 文件,前端请求 https://xx.com/domain.json 获取。哪个方案比较好,有没有其他更好的方案,谢谢。
    44 条回复    2024-10-28 09:39:21 +08:00
    proxytoworld
        1
    proxytoworld  
       2024-10-25 14:09:29 +08:00
    为什么不是后端监测哪个延迟低就用那个, 你这样配多个域名,还得多域名解析,检测
    InDom
        2
    InDom  
       2024-10-25 14:12:40 +08:00
    不要一直切换,发现失败或延迟高的时候再切换。

    不经常换就 json ,存数据库静态回到文件,或者重写 json url 到程序也一样,这里根本不是问题。
    lcy630409
        3
    lcy630409  
       2024-10-25 14:18:22 +08:00
    第一次的时候测试+设置里 手动切换
    cdring
        4
    cdring  
    OP
       2024-10-25 14:24:37 +08:00
    @proxytoworld 设计到海外用户,每个 api 域名套了不同厂商的 cdn 加速,所以每个国家的访问 api 域名延迟都不一样。直接前端请求域名延迟比较好吧。
    cdring
        5
    cdring  
    OP
       2024-10-25 14:25:05 +08:00
    @lcy630409 太麻烦了,还是自动方便些
    cdring
        6
    cdring  
    OP
       2024-10-25 14:26:42 +08:00
    @InDom 打开前端页面就检测哪个域名延迟低,然后就拿这个延迟低的域名请求后端。这样不好吗
    DesnLee
        7
    DesnLee  
       2024-10-25 14:27:49 +08:00
    每次请求都同时全部请求,拿第一个返回的结果,其他丢弃
    webszy
        8
    webszy  
       2024-10-25 14:34:10 +08:00
    @DesnLee 厉害,有道理
    cdring
        9
    cdring  
    OP
       2024-10-25 14:34:23 +08:00
    @DesnLee 万一第一个返回的域名延迟高呢。导致访问很慢
    spritecn
        10
    spritecn  
       2024-10-25 14:40:14 +08:00
    这个事前公司做过,通过自研壳浏览器做到的
    wangyongbo
        11
    wangyongbo  
       2024-10-25 14:40:20 +08:00
    @cdring DNS 可以根据 用户的 IP 所属的地域 , 把域名解析到不同的 IP. 这个功能满足不了你们的需要吗?
    jenson47
        12
    jenson47  
       2024-10-25 14:46:57 +08:00
    看具体需求,按道理 cdn 在某个地方应该是比较稳定的,或者说我们就认为心跳的响应时间在多少之内是 ok 的。
    第一次或者当超过响应时间,就触发一次选择 api ,前端并发的去请求,就用第一个回来的,其他都废弃,或者保留前三,轮着来?
    lasuar
        13
    lasuar  
       2024-10-25 14:50:39 +08:00
    你后来 多数据库的一致性问题呢
    liuliancao
        14
    liuliancao  
       2024-10-25 14:59:06 +08:00
    这个原始需求是希望用户使用最快的 cdn 链接吗 这个肯定在前端做好点 不过最好是自己搞一个域名 做一下区域 dns 不要写进代码里面 这个是可以测试的 不同区域哪个 cdn 好
    8355
        15
    8355  
       2024-10-25 15:02:06 +08:00
    这个 cdn 和云厂商都有相关的业务吧
    比如说阿里云叫全球加速
    yplam
        16
    yplam  
       2024-10-25 15:10:09 +08:00 via Android
    如果这个 JSON 请求同时用作测速的话用静态文件好点,不然你后端还要保证在不同 QPS 下响应速度一致
    cdring
        17
    cdring  
    OP
       2024-10-25 15:10:39 +08:00
    @spritecn 自研壳浏览器,你们公司厉害
    cdring
        18
    cdring  
    OP
       2024-10-25 15:12:29 +08:00
    @jenson47 这也是一种办法
    cdring
        19
    cdring  
    OP
       2024-10-25 15:12:47 +08:00
    @lasuar 不设计到多数据库
    cdring
        20
    cdring  
    OP
       2024-10-25 15:13:15 +08:00
    @8355 是的。
    cdring
        21
    cdring  
    OP
       2024-10-25 15:14:09 +08:00
    @yplam 目前是计划用静态资源做,我过来请教看有没有更好的方案
    8355
        22
    8355  
       2024-10-25 15:19:25 +08:00
    @cdring #20 除了自动加速以外主要是用二级域名指向不同的区域节点,比如欧洲/美国等等通常是为了某些业务的特殊性比如说欧洲的 GDPR 等等可以强制根据某些业务层面地址或者其他定位信息进行划分强制走某二级域名。
    cdring
        23
    cdring  
    OP
       2024-10-25 15:49:56 +08:00
    @8355 好的,谢谢
    ounxnpz
        24
    ounxnpz  
       2024-10-25 16:05:48 +08:00
    如果是网页的话,可以用同一个域名,用 DNS Geolocation 之类的方法(具体取决于 DNS 服务商)实现不同区域解析到不同的 IP
    sunchuo
        25
    sunchuo  
       2024-10-25 16:48:53 +08:00   ❤️ 1
    哎。这个项目感觉不太对劲。🤦
    2I0Mto2kjm0c0B9i
        26
    2I0Mto2kjm0c0B9i  
       2024-10-25 17:04:04 +08:00
    刚好昨天做了这个需求,在前面先 ping 所有节点,哪个快就存到本地,记录一个时间戳我们是 1 小时,下次对比时间戳再重新 ping
    perfectlife
        27
    perfectlife  
       2024-10-25 17:07:34 +08:00 via Android
    智能 dns 呢,同一个域名不同国家地区解析到不同的地址
    kaf
        28
    kaf  
       2024-10-25 17:29:08 +08:00
    后端开一个延迟检查接口,客户端定时访问所有域名的延迟时间,请求时读取延迟最小的。这样吗
    SenLief
        29
    SenLief  
       2024-10-25 17:37:53 +08:00
    我觉得你在做微信,自己内置 dns ,不走系统 dns ,哈哈。
    xiaochena
        30
    xiaochena  
       2024-10-25 17:44:54 +08:00
    正常的逻辑应该是同一个 api 域名套用多个不同厂商的 cdn 加速吧。哪有加一个国家加一个 api 域名的道理。。。emmm
    shakaraka
        31
    shakaraka  
    PRO
       2024-10-25 18:00:27 +08:00
    Promise.race 解君愁
    wuhunyu
        32
    wuhunyu  
       2024-10-25 18:36:18 +08:00
    看描述,服务器应该是分别部署在不同的国家地域了。我比较好奇的是,如果前端根据延时来判断走哪个区域的服务,特殊情况下,一会儿访问这个国家的服务器,一会儿访问另一个国家的服务器,不同区域的数据是怎么同步的,跨地域的数据同步成本会比较,而且势必会存在数据不一致的问题,好奇你们的后端是怎么处理的。像是阿里云,他们的许多产品都是分地区的,比如上海,广州。而且很多时候不同区域的产品产生的数据他也不提供转区的服务。按我理解,区域 1 的前端最好就是访问区域的 1 的服务端,不然可能因为数据同步延迟导致一些奇怪的问题。如果是同一个区域的话,我又觉得没啥必要给同一个区域多个域名吧
    cdring
        33
    cdring  
    OP
       2024-10-26 00:45:41 +08:00
    @kaf 后端不开检测延时接口,前端自己检查延时
    cdring
        34
    cdring  
    OP
       2024-10-26 00:46:04 +08:00
    @SenLief 不是的
    cdring
        35
    cdring  
    OP
       2024-10-26 00:47:19 +08:00
    @iapplebear 需求和我这很接近
    cdring
        36
    cdring  
    OP
       2024-10-26 00:47:55 +08:00
    @perfectlife 还用不上智能 dns ,因为就是想多个域名做高可用,域名挂了就切换
    cdring
        37
    cdring  
    OP
       2024-10-26 00:48:30 +08:00
    @xiaochena 是这么回事,我之前没说清楚
    cdring
        38
    cdring  
    OP
       2024-10-26 00:49:43 +08:00
    @wuhunyu 没有这么复杂,服务器就在一个区域,就是为了解决这个域名访问不了,换个域名在请求
    cdring
        39
    cdring  
    OP
       2024-10-26 00:50:02 +08:00
    @wunonglin 没听过,我了解下,谢谢大神
    yinmin
        40
    yinmin  
       364 天前 via iPhone
    很简单啊,拿了 domain.json 后,对所有域名同时发起异步 api 请求,记录下第一个收到结果的,就用这个。
    yinmin
        41
    yinmin  
       364 天前 via iPhone
    话说回来,大厂都是用智能 dns ,你们这个方案就是个小聪明
    DesnLee
        42
    DesnLee  
       364 天前
    @cdring #9 直接拿着所有域名并发请求,谁先返回就用谁的结果。Promise.race
    mytsing520
        43
    mytsing520  
    PRO
       364 天前
    用 CDN+TCP 优化来处理,成本相较而言最低。
    wuhunyu
        44
    wuhunyu  
       362 天前
    @yinmin 这样做前端是简单了,后端服务器压力平白无故多做很多无用功。我觉得每隔几分钟主动 ping 一次,取最快的那个域名,如果最快的那个域名也超时,就主动 ping 一次,更新域名列表,再用最快的域名尝试一次,还是超时就提示用户服务不可用吧
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   890 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 22:57 · PVG 06:57 · LAX 15:57 · JFK 18:57
    ♥ Do have faith in what you're doing.