DNS负载均衡,导致Android和iOS访问接口,导致导致时间相差很大

故事背景

在目前的公司中,同一款应用,iOS平台和Android平台,在访问相同的接口的时候,表现出很大的时间差异性。其中主要表现为在iOS平台上应用获取到数据紧紧只需要300ms左右。但是使用Android获取数据在30s-70s左右,但是奇怪的是,可能某一个时刻,Android平台的应用获取数据也能在300ms获取。如此不稳定,非常让人头疼

下图使用postman来模拟客户端网络请求,红色表明部分,使用时间为75s左右,对于如此长的时间,一般都已经超过了设置的超时时间了。

数据请求很慢的情况

模拟客户端发起网络请求-75s.png

数据请求正常的情况

Paste_Image.png

以上请求的是相同的接口,时间会相差很大。

发现问题端倪

这个问题困扰了我们Android工程师很久,经过多方面的努力。最后再一次数据处理抓包过程中,发现访问时间长和访问时间短的两次ip地址不一样。由此打开了一扇窗户

问题分析

  1. 使用nslookup分析DNS域名解析,如下图

    nslookup解析DNS.png

    不论是Windows下的Dos还是mac下bash,键入nslookup后输入你的域名,就可以看到域名解析出来的ip地址,一般而言,我们可以在地址栏中,使用ip替换域名直接访问对应的网址。有兴趣者可以解析百度的域名。

    • 重点是从图片可以看出,改域名解析出两个ip地址,然后如何能在终端中知道哪个ip地址可以快速访问,哪个不能呢?或者两个都可以快速的访问
  2. 使用telnet测试ip是否可以访问到接口服务端

    使用telnet测试是否访问到接口服务器.png
  3. 使用postman,通过使用ip替换域名验证访问效率

    使用终端中一致trying的ip替换域名,结果

    Paste_Image.png

    使用终端中可以访问通的ip替换域名,如下

    Paste_Image.png

综上多个测试,可以发现,导致Android上的应用访问慢是由于DNS域名解析,返回一个无效的ip地址导致的。经过多次测试,发现DNS解析出两个ip的顺序不是确定的,所以在Android应用中有时候快是因为android应用获取ip是至上而下的,所以当有效的ip是第一个获取的ip时候,android应用表现的则很快的得到了数据。反正,则不能

疑问

虽然是相同的接口,但是在iOS平台表现则良好。这无疑让人产生很大的疑问,为什么。

猜想

  1. 在iOS中,对DNS解析出来的两个ip地址同时发起请求,response优先选择可以访问通的。
  2. 通过查找资料,在iOS平台,对DNS解析做了缓存,而且清理缓存的时间周期为24小时,所以,可能只是某一次数据请求成功后,缓存了成功的ip地址到本地,然后每次请求都使用这个ip地址。

希望但是没有做到的

本希望搞清楚iOS平台是对DNS解析出多ip的情况是如何选择ip进行请求的。

希望可以打印出DNS解析的日志,以及接口请求选择ip的日志。这样就可以知道iOS选择的ip的工作原理了。

有知道希望告知方法,方案等,Th

喜欢请随意


图片发自App

更多相关文章

  1. Android之Http网络编程(二)
  2. Android(安卓)RxJava实际应用案例讲解:使用RxJava的最佳开发场景
  3. Android:RxJava 结合 Retrofit 全面实现 网络请求出错重连
  4. Android(安卓)Q 带来哪些变化
  5. Android与电脑局域网共享之:Samba Server
  6. Android电量优化
  7. Android(安卓)简历
  8. Android用无线调试真机及在Eclipse的File Explorer中访问真机的D
  9. Android中获取手机IMEI,IMSI, MAC(Android(安卓)6.0、支持4G环境获

随机推荐

  1. 【linux-56】文件系统管理-df,du
  2. 用好HugePage,告别Linux性能故障
  3. 一个可能让你的页面渲染速度提升数倍的CS
  4. 一些鲜为人知的的CSS3属性
  5. Linux中常用压缩及解压命令
  6. CSS calc() 函数
  7. 常用的 tailwindcss 模板站点
  8. 如果使用的库不支持异步,可以使用多进程并
  9. 【linux】循序渐进学运维-基础篇-yum管理
  10. 网页字体更清晰的css用什么?