如何利用HTTPDNS降低DNS解析开销

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 如何利用HTTPDNS降低DNS解析开销 1. 背景说明 移动场景下DNS的解析开销是整个网络请求延迟中不可忽视的一部分。一方面基于UDP的localDNS解析在高丢包率的移动网络环境下更容易出现解析超时的问题,另一方面在弱网环境下DNS解析所引入的动辄数百毫秒的网络延迟也大幅加重了整个业务请求


一、背景说明


移动场景下DNS的解析开销是整个网络请求延迟中不可忽视的一部分。一方面基于UDP的localDNS解析在高丢包率的移动网络环境下更容易出现解析超时的问题,另一方面在弱网环境下DNS解析所引入的动辄数百毫秒的网络延迟也大幅加重了整个业务请求的负担,直接影响用户的终极体验。




二、解决方案


阿里云移动服务团队推出的HTTPDNS在解决了传统域名劫持以及调度精确性的问题的同时,也提供了开发者更灵活的DNS管理方式。通过在客户端合理地应用HTTPDNS管理策略,我们甚至能够做到DNS解析0延迟,大幅提升弱网环境下的网络通讯效率。


DNS解析0延迟的主要思路包括:


(1)构建客户端DNS缓存;


通过合理的DNS缓存,我们确保每次网络交互的DNS解析都是从内存中获取IP信息,从而大幅降低DNS解析开销。根据业务的不同,我们可以制订更丰富的缓存策略,如根据运营商缓存,可以在网络切换的场景下复用已缓存的不同运营商线路的域名IP信息,避免网络切换后进行链路重选择引入的DNS网络解析开销。另外,我们还可以引入IP本地化离线存储,在客户端重启时快速从本地读取域名IP信息,大幅提升首页载入效率。


(2)热点域名预解析;


在客户端启动过程中,我们可以通过热点域名的预解析完成热点域名的缓存载入。当真正的业务请求发生时,直接由内存中读取目标域名的IP信息,避免传统DNS的网络开销。


(3)懒更新策略;


绝大多数场景下业务域名的IP信息变更并不频繁,特别是在单次APP的使用周期内,域名解析获取的IP往往是相同的(特殊业务场景除外)。因此我们可以利用DNS懒更新策略来实现TTL过期后的DNS快速解析。所谓DNS懒更新策略即客户端不主动探测域名对应IP的TTL时间,当业务请求需要访问某个业务域名时,查询内存缓存并返回该业务域名对应的IP解析结果。如果IP解析结果的TTL已过期,则在后台进行异步DNS网络解析与缓存结果更新。通过上述策略,用户的所有DNS解析都在与内存交互,避免了网络交互引入的延迟。


2.1 Demo示例


我们在HTTPDNS Demo github中提供了Android/iOS SDK以及HTTPDNS API接口的使用例程,这里我们通过使用Android SDK的例程演示如何实现0延迟的HTTPDNS服务。




public class NetworkRequestUsingHttpDNS {


   private static HttpDnsService httpdns;


   // 填入您的HTTPDNS accoutID信息,您可以从HTTPDNS控制台获取该信息


   private static String accountID = "100000";


   // 您的热点域名


   private static final String[] TEST_URL = {"http://www.aliyun.com", "http://www.taobao.com"};


   public static void main(final Context ctx) {


       try {


           // 设置APP Context和Account ID,并初始化HTTPDNS


           httpdns = HttpDns.getService(ctx, accountID);


           // DegradationFilter用于自定义降级逻辑


           // 通过实现shouldDegradeHttpDNS方法,可以根据需要,选择是否降级


           DegradationFilter filter = new DegradationFilter() {


               @Override


               public boolean shouldDegradeHttpDNS(String hostName) {


                   // 此处可以自定义降级逻辑,例如www.taobao.com不使用HttpDNS解析


                   // 参照HttpDNS API文档,当存在中间HTTP代理时,应选择降级,使用Local DNS


                   return hostName.equals("www.taobao.com") || detectIfProxyExist(ctx);


               }


           };


           // 将filter传进httpdns,解析时会回调shouldDegradeHttpDNS方法,判断是否降级


           httpdns.setDegradationFilter(filter);


           // 设置预解析域名列表,真正使用时,建议您将预解析操作放在APP启动函数中执行。预解析操作为异步行为,不会阻塞您的启动流程


           httpdns.setPreResolveHosts(new ArrayList<>(Arrays.asList("www.aliyun.com", "www.taobao.com")));


           // 允许返回过期的IP,通过设置允许返回过期的IP,配合异步查询接口,我们可以实现DNS懒更新策略


           httpdns.setExpiredIPEnabled(true);


           // 发送网络请求


           String originalUrl = "http://www.aliyun.com";


           URL url = new URL(originalUrl);


           HttpURLConnection conn = (HttpURLConnection) url.openConnection();


           // 异步接口获取IP,当IP TTL过期时,由于采用DNS懒更新策略,我们可以直接从内存获得最近的DNS解析结果,同时HTTPDNS SDK在后台自动更新对应域名的解析结果


           ip = httpdns.getIpByHostAsync(url.getHost());


           if (ip != null) {


               // 通过HTTPDNS获取IP成功,进行URL替换和HOST头设置


               Log.d("HTTPDNS Demo", "Get IP: " + ip + " for host: " + url.getHost() + " from HTTPDNS successfully!");


               String newUrl = originalUrl.replaceFirst(url.getHost(), ip);


               conn = (HttpURLConnection) new URL(newUrl).openConnection();


               // 设置HTTP请求头Host域


               conn.setRequestProperty("Host", url.getHost());


           }


           DataInputStream dis = new DataInputStream(conn.getInputStream());


           int len;


           byte[] buff = new byte[4096];


           StringBuilder response = new StringBuilder();


           while ((len = dis.read(buff)) != -1) {


               response.append(new String(buff, 0, len));


           }


           Log.e("HTTPDNS Demo", "Response: " + response.toString());


       } catch (Exception e) {


           e.printStackTrace();


       }


   }


   /**


    * 检测系统是否已经设置代理,请参考HttpDNS API文档。


    */


   public static boolean detectIfProxyExist(Context ctx) {


       boolean IS_ICS_OR_LATER = Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH;


       String proxyHost;


       int proxyPort;


       if (IS_ICS_OR_LATER) {


           proxyHost = System.getProperty("http.proxyHost");


           String port = System.getProperty("http.proxyPort");


           proxyPort = Integer.parseInt(port != null ? port : "-1");


       } else {


           proxyHost = android.net.Proxy.getHost(ctx);


           proxyPort = android.net.Proxy.getPort(ctx);


       }


       return proxyHost != null && proxyPort != -1;


   }


}






对于使用HTTPDNS API接口的开发者,您可以在客户端自己定制更高效,并且符合您需求的HTTPDNS管理逻辑。


立即试用HTTPDNS服务,点击此处




钉钉搜索35248489,加入阿里云云原生应用研发平台EMAS技术交流群,探讨最新最热门的应用研发技术和实践。(或钉钉扫码加入)


image.png


相关文章
|
28天前
|
网络协议 Linux Docker
在Linux中,如何指定dns服务器,来解析某个域名?
在Linux中,如何指定dns服务器,来解析某个域名?
|
17天前
|
网络协议
DNS正向解析实现
文章介绍了DNS正向解析的实现,包括资源记录的定义、配置区域解析记录的步骤,并通过实际操作展示了如何为"yinzhengjie.com"域名配置DNS解析记录。
26 2
DNS正向解析实现
|
28天前
|
域名解析 存储 缓存
在Linux中,DNS进行域名解析的过程是什么?
在Linux中,DNS进行域名解析的过程是什么?
|
30天前
|
域名解析 网络协议 Linux
在Linux中,如何配置DNS服务器和解析服务?
在Linux中,如何配置DNS服务器和解析服务?
|
1月前
|
负载均衡 网络协议 安全
解析网络流量管理方案:简化基于云的DNS负载均衡
解析网络流量管理方案:简化基于云的DNS负载均衡
54 1
|
1月前
|
域名解析 监控 负载均衡
【域名解析DNS专栏】智能DNS解析:自动选择最快服务器的奥秘
在互联网中,智能DNS解析作为一项先进技术,根据用户的网络环境和服务器负载情况,自动挑选最优服务器进行域名解析,显著提升访问速度与体验。其工作原理包括实时监控服务器状态、分析数据以选择最佳路由。通过负载均衡算法、地理位置识别及实时性能测试等策略,确保用户能获得最快的响应。这项技术极大提高了互联网服务的稳定性和效率。
90 5
|
1月前
|
域名解析 负载均衡 网络协议
【域名解析DNS专栏】DNS解析中的Anycast技术:原理与优势
在互联网中,DNS将域名转换为IP地址至关重要。Anycast技术通过将同一IP地址分配给多台地理上分散的服务器,确保客户端总能连接到最近且最轻载的服务器,从而加速DNS解析、实现负载均衡、提升抵御DDoS攻击的能力及服务高可用性。通过动态路由协议如BGP实现,Anycast极大地增强了DNS系统的性能和稳定性。
50 2
|
2月前
|
域名解析 安全 物联网
阿里云EMAS HTTPDNS 扩展全球服务节点:提升解析安全性与网络覆盖
阿里云EMAS HTTPDNS新增国内西南、华南及国际欧洲、美东服务节点,提升了全球覆盖能力与性能。作为高效域名解析服务,EMAS HTTPDNS针对互联网、汽车、物流、IOT等行业提供支持,解决了传统解析易遭劫持等问题。新增节点优化了就近调度功能,显著缩短响应时间并增强了服务稳定性和连续性,尤其为中国企业的海外业务提供了强有力的支持。此次扩展展现了阿里云对服务质量的持续追求和全球市场布局的战略思考。
|
28天前
|
域名解析 网络协议 数据中心
【应用服务 App Service】当遇见某些域名在Azure App Service中无法解析的错误,可以通过设置指定DNS解析服务器来解决
【应用服务 App Service】当遇见某些域名在Azure App Service中无法解析的错误,可以通过设置指定DNS解析服务器来解决
|
1月前
|
域名解析 编解码 负载均衡
【域名解析DNS专栏】域名解析中的EDNS扩展:提升DNS协议灵活性
在互联网中,DNS作为连接用户与网络资源的关键桥梁,其传统协议在面对复杂网络环境时显现出局限性。EDNS(扩展机制)应运而生,通过在DNS请求和响应中添加额外选项和字段,提升了DNS的功能和灵活性。EDNS不仅提高了查询效率和支持更大范围的数据类型,还能增强安全性并通过负载均衡提升系统稳定性。例如,允许指定更大的UDP数据包大小以减少分片和重传,支持DNSSEC加强安全性验证,以及通过Python示例代码展示了如何在DNS查询中使用EDNS选项。随着技术发展,EDNS将在域名解析领域扮演更重要角色。
70 0

相关产品

  • 云解析DNS
  • 推荐镜像

    更多