有時候app里面的資源是一些外鏈,所以我們不能保證請求外鏈的結(jié)果棍现,外鏈失效或者請求速度慢或者其他問題调煎,雖然不是自己的服務(wù)器,但還是有解決的辦法己肮。
第一步士袄,外鏈先過自己的服務(wù)器,把失效的鏈接先過濾掉谎僻,剩下那些能用的鏈接娄柳,我們還需要對其進一步的優(yōu)化。
優(yōu)化的原理艘绍,我們拿到外鏈的host西土,一個host對應(yīng)著多個ip,我們需要拿到那個網(wǎng)絡(luò)最優(yōu)的ip鞍盗,如果直接拿host取訪問需了,因為ip會有緩存的緣故,每次訪問的都是同一個ip般甲。我們需要拿host去做dns查詢肋乍,查詢得到ip后,直接拿ip取訪問敷存。
這里是查詢的具體邏輯:
協(xié)議
通過一個請求返回查詢信息墓造,這個查詢服務(wù)騰訊有免費的,不過每天有固定查詢次數(shù)
218.107.196.221;218.107.196.222,180
前2個為ip用分號分隔锚烦,后面一個為TTL(過期時間)
1. dn 表示要查詢的域名
2. ttl=1 表示要求 D+服務(wù)器在響應(yīng)結(jié)果中攜帶解析結(jié)果的 ttl 值
3. 返回的ttl和域名解析結(jié)果用英文逗號分割觅闽。
4. Http請求超時時間建議設(shè)置為10s
5. ts當(dāng)前時間的時間戳
實現(xiàn)細節(jié)
1. 在內(nèi)存中緩存對應(yīng)域名的解析結(jié)果,緩存規(guī)則如下:
緩存時間:緩存時間建議采用查詢得到的域名 TTL
緩存更新應(yīng)在以下兩種情形下進行:
1. ?用戶網(wǎng)絡(luò)狀態(tài)發(fā)生變化時: 移動互聯(lián)網(wǎng)的用戶的網(wǎng)絡(luò)狀態(tài)由 3G 切 Wi-Fi涮俄,Wi-Fi 切 3G 的情況下蛉拙,其接入點的網(wǎng)絡(luò)歸屬可能會發(fā)生變化。所以在用戶的網(wǎng)絡(luò)狀態(tài)發(fā)生變化時彻亲,需要重新向服務(wù)器發(fā)起域名解析請 求孕锄,以獲取到用戶當(dāng)前網(wǎng)絡(luò)歸屬下的最優(yōu)指向吮廉。
2. 緩存過期時: 當(dāng)域名解析的結(jié)果緩存時間到期時,客戶端應(yīng)該向服務(wù)器重新發(fā)起域名解析請求以獲取最新的域名對應(yīng)的 IP畸肆。為了減少用戶在緩存過期后重新進行域名解析時的等待時間宦芦,建議在 75% TTL 時就開始進行域名解析。如本地緩存的 TTL 為 600s轴脐,那么在第 600*0.75=450s 時客戶端就應(yīng)該開始進行域名解析调卑。
2. 發(fā)起http請求時,首先從緩存中查詢是否有對應(yīng)域名的ip大咱,如果沒有則之前的邏輯不變令野,并且觸發(fā)緩存更新,如果有對應(yīng)ip徽级,則直接使用ip請求
實現(xiàn)策略:
1.?應(yīng)用啟動時觸發(fā)請求
2. ?應(yīng)用程序在前臺气破,并且網(wǎng)絡(luò)狀態(tài)發(fā)生變化時, 觸發(fā)請求(wifi切換到數(shù)據(jù)網(wǎng)絡(luò)餐抢,或相反)
3. http請求時现使,如果沒有對應(yīng)域名的ip,觸發(fā)請求旷痕,如果有對應(yīng)ip但是ttl過期碳锈,也觸發(fā)請求(ttl最小值設(shè)為10分鐘)
4. 需要解析的域名通過配置更新來獲取