TAT.iAzrael 千方百計加速 Web 之加速 DNS 解析
In 未分類 on 2013年10月30日 by view: 10,424
4

通常情況下,做移動開發時,如果要向后臺請求數據,都會直接使用 TCP 通信。但實際上一來 HTTP 比 TCP 簡單易用多了,二來有很多現有 CGI 如果要進行改造得花很大功夫。還是會有使用 HTTP 請求來拉取數據。

在做 Android QQ 二維碼時,掃描到二維碼字符串,就是把該字符串用 HTTP 傳給后臺,后臺解析后返回給客戶端,客戶端再進行下一步處理。在提交測試后,測試同事發現,在移動網絡上,DNS 解析會經常失敗,導致二維碼掃描功能不可用。功能測試不通過,導致無法發布。同時測試喜歡在清空 DNS 緩存和屏蔽了 DNS 解析的情況下,二維碼解析功能仍然可用。因此這里增加了如下處理:
1. 進入 “掃一掃” 的界面時,客戶端就開始對 CGI 所在域名進行解析,并把解析結果緩存到本地文件;
2. 發起 CGI 請求時,還是使用原域名進行請求,如果 DNS 解析失敗,則用第一步緩存的 IP 替換掉 CGI 中的域名再發起一次請求。

由于國內有好幾個網絡運營商,公司在不同的網絡環境都有不一樣的出口 IP,因此選擇最近的 IP 才能快速訪問 CGI。所以緩存域名結果時,需要區分網絡分別保存。

這樣,當用戶的手機上至少成功使用了一次二維碼掃描時,CGI 對應的 IP 就保存下來了(至少有一個出口 IP)。下次訪問(同一次登錄或者關閉手機 QQ 后再打開)時,即使 DNS 解析失敗,還是能使用上一次保存的 IP 進行訪問,可能會相應比較慢(用戶從 A 網絡切換到了 B 網絡),但起碼保證了功能的可用性。

實現起來也不難,Java 都有現成的接口了。
主動發起 DNS 解析只要調用 InetAddress 的接口即可,把獲取到的結果保存到 SharedPreferences 供下次使用:

然后在 HTTP 請求出現 DNS 解析錯誤的時候,用 IP 替換掉 URL 中的域名即可:

這里之所以不直接用上次保存的 IP 來替換域名進行訪問,是因為在正常情況下,進入 “掃一掃” 的界面時,已經預先對所用域名進行了預解析,如果解析成功,調用 openRequest 時就不用 DNS 查詢了;而如果預解析失敗了,openRequest 的時候還能再嘗試一次,失敗時才使用 IP 訪問。同時,很多用戶都會在移動網絡和 WIFI 網絡中切換,如果直接用 IP 替換域名,會出現用戶當前是移動網絡,而是用的域名 IP 是在教育網 IP(上一次使用的是教育網 WIFI)的情況,導致 CGI 響應變得更慢。

當然,更好的解決方法是:先檢測當前用戶的網絡環境,如果本地保存了對應網絡的 IP,直接使用 IP 請求;如果沒有,再改用域名來請求。

還有更進階的方案:第一次登陸時,從服務器拉取一份 host 列表(每個域名包括各個網絡環境的出口 IP),把所有 HTTP 請求的域名都替換成相應 IP,這樣就能完美解決 DNS 不可用、DNS 解析失敗的情況了。之后維護 host 文件的更新即可。

原創文章轉載請注明:

轉載自AlloyTeam:http://www.5418yb.com/2013/10/do-everything-possible-to-speed-up-dns-resolution-speed-web/

  1. 李白 2017 年 3 月 30 日

    找外包,想要穩定靠譜、費用還低的外包商?難!
    怕被坑?上空心 www.kxhtml.com 一家 100 元/頁的軟件開發云平臺!
    在招人,海招海篩、培訓,到頭來上手還是慢!
    用結果打臉!上空心 www.kxhtml.com 一家先看開發結果后付費的平臺!
    想創業,有 idea? 到處找 CTO? 技術難關攻不破?
    立即上線!上空心 www.kxhtml.com 一家開發神速火箭般輸出頁面的平臺!

  2. 喬布尸 2014 年 3 月 24 日

    在我們學校,手機使用 wifi,然后代理,在騰訊相關產品掃二維碼基本失效,比如微信網頁登陸,QQ 掃碼加扣,使用 socket5。必須換回移動網絡才能成功。

  3. 廖俊媛 2013 年 10 月 30 日

    受益匪淺啊

  4. Damon Zhao 2013 年 10 月 30 日

    Nice

發表評論