cdn業務涉及不少網絡問題,而國內的網絡環境又很複雜,因此常常會出現不少業務中出現下載特別慢的問題, 對客戶資源的注入影響很嚴重,輕則致使任務大量超時,堆積,重則會出現業務不能在規定時間內完成。因此通常會用各類方法探測鏈路的好壞, 探測合適的帶寬和併發。其中有個容易忽略的就是去拉取資源的時候的鏈路選擇。html
該文章後續仍在不斷的更新修改中, 請移步到原文地址http://dmwan.ccpython
通常拉取客戶的資源,客戶都會提供一個或者兩個ip,電信或者移動。比較通常的作法,假如用python實現的話,有的人會使用requests 庫,或者使用curl , 或者使用wget。bash
這三種方法的區別是什麼?第一種通常不會用,爲何?由於requests http解析使用的urllib庫,是py實現,大量注入,大量http協議解析,會打高cpu,此外,使用requests ,綁定ip,使用自定義運營商ip去獲取資源,是至關麻煩的一件事,可是也能夠實現,經過在socket層封裝也可行。curl 是使用libcrul 底層實現,c實現的協議解析,一個特色就是快,使用libcurl 也能夠指定公網出口ip 。 使用wget和curl 均可以使用指定出口ip。服務器
首先,咱們不指定出口會出現什麼現象?不指定出口。不少三線服務器就會受路由表影響,使用下面命令
能夠查出出口ip 會使用哪一個interface:網絡
ip route get to to_ip
三線機器都會設置不少路由規則,不指定就走這些,那若是指定bind ip ,哪一個優先級大?bind ip大!併發
如今通用的作法是客戶ip是什麼線,咱們這就使用 isp 的ip去 wget bind-address 去取,可是這樣沒問題? 同樣會有問題。問題就在解析域名上,若是恰巧客戶提供多 isp 的ip ,而你的路由表設置不當, 就會致使下載很慢!curl
舉個例子。客戶源站的域名提供兩個 A 記錄,分別是電信和聯通,而你的本地路由表到dns 服務器 的路由表恰巧設置走的路由是電信的,你本地 wget bind-address 使用的ip 是聯通的,那會什麼問題?dns 解析域名,會返回一個客戶的電信ip 給你,而後你用你聯通的ip 去跟對方建聯, 而後,你就悲劇了!socket
有什麼方法,避免這個問題?給個連接url
wget 官方1.8 後修復了這個問題,提供了個參數,你能夠bind ip 去訪問dns 。而後就可用控制訪問源站兩邊的isp線路了。固然,你也能夠直接不寫域名,直接上ip。 code