• 移动环境下DNS解析失败后的优化方案


    我们手机游戏中,通过上报收集到的数据来分析,发现相当多的一部分用户,在请求一些配置时会遇到无法解析的情况,或者域名的解析直接被拦截了。

    特别是游戏的补丁包文件(放在CDN上),遇到的域名解析失败是最多的,比较小的配置可以通过请求动态接口来获得数据,但是比较大的补丁文件,比如单个zip就超过15M这样的文件,就无法提供接口来返回数据了。这些问题很棘手,如何解决确实困扰了很久

    有一个方案,就是分流,多提供几个CDN的域名进行轮询,也就是下载分流。但它依然面临的问题是域名解析,被ISP运营商劫持就over了(电信、移动它们经常干这种事情)

     

    后来内部讨论的结果是说把这些请求全部放到BGP机房(成本会高一些),然后较大的补丁文件放到CDN上,购买几家CDN供应商,配置几个不同的CDN请求域名,使用轮询的方式下载补丁。但即便是这种,如同上面所说,依然无法避免域名解析失败的问题

     

    后来我看到一篇文件,就是腾讯的GSLB团队开放出来的HttpDNS服务(点击查看原文链接>>),说白一点就是请求一个动态接口,这个动态接口根据你请求的ip来返回你想要访问域名的最近的ip列表(它会不断的优化ip库)。这样所有的请求都可以走ip了,跳过ISP的域名解析了

     

     

    比如我们想要访问www.baidu.com,那么请求http://119.29.29.29/d?dn=www.baidu.com

    就会返回离我最近的IP地址:

    180.97.33.107;180.97.33.108

    我使用的是苏州电信,它返回的IP列表是泰州的电信,我直接访问IP也是能显示百度首页

    http://180.97.33.108/

    能访问到,是因为它的服务器配置对ip也做了支持。如果遇到比如网宿这种它没有对相应的ip进行支持(就是当你直接访问ip时不鸟你的),怎么办呢?

     

    我们来做这样一个实验,使用libcurl访问www.baidu.com,正常情况下应该是直接返回百度首页,现在我在本地配置nginx(但未配置hosts),规则如下图:

    然后我访问http://127.0.0.1/index.html

    这样访问就直接到我本机了,使用了我本机的配置(下图是Nginx的访问日志)。

     

    如何做到的呢?其实就只是修改了http的头部host参数。我直接访问指定的ip,并设置相应的host,这样就绕开了域名解析这一步。

    回到文章的开始,腾讯提供的HttpDNS就派上用场了,调用接口获取到IP列表,取其中一个ip,然后修改访问目标网址(以http://ip/xxx开头了),并设置请求的host,这样就直接跳过了域名解析。其实还是有解析的,只是这一步完全交给腾讯的那个动态接口了,它会根据域名来返回离我当前请求网络最近的ip列表

     

    希望这篇文章对同样被域名解析所困扰的同行有所帮助吧,如果你有更好的方案,欢迎一起讨论:)

     

    本文参考链接:

    腾讯的 GSLB 新思路 HttpDNS 已经实现可用

    curl 请求指定host 的 URL

    libcurl httpcustomheader.c

  • 相关阅读:
    数据结构 C#描述 第七章 第二部分
    ASP.NET自定义控件组件开发 第一章 待续
    数据结构 C#描述 第五章 栈和队列
    新手写自定义分页控件
    为什么要自己写控件页不用网上成熟的控件呢?
    设计模式之间可以相互"功能替换"吗?
    转:说说大型高并发高负载网站的系统架构
    自定义控件开发之自定义视图状态
    为什么要自己写控件而不用网上成熟的控件(续:源代码)
    C#面试题之排序
  • 原文地址:https://www.cnblogs.com/meteoric_cry/p/4703013.html
Copyright © 2020-2023  润新知