要解決問題,我們得先得了解下現在國內各isp的localdns的基本情況。國內運營商localdns造成的使用者訪問異常可以歸為下三類:
為何localdns要把網域名稱解析結果進行快取呢?原因有以下幾個:
(1)保證使用者訪問流量在本網內消化:國內的各網際網路接入運營商的頻寬資源、網間結算費用、idc機房分布、網內icp資源分布等存在較大差異。為了保證網內使用者的訪問質量,同時減少跨網結算,運營商在網內搭建了內容快取伺服器,通過把網域名稱強行指向內容快取伺服器的ip位址,就實現了把本地本網流量完全留在了本地的目的。
(2)推送廣告:有部分localdns會把部分網域名稱解析結果的所指向的內容快取,並替換成第三方廣告聯盟的廣告。
這種型別的行為就是我們常說的網域名稱快取,網域名稱快取會導致使用者產生以下的訪問異常:
a、僅對80埠的http服務做了快取,如果網域名稱是通過https協議或其它埠提供服務的,使用者訪問就會出現失敗。比如支付服務、遊戲通過指定埠連線connect server服務等。
b、快取伺服器的運維水平參差不齊,時有出現快取伺服器故障導致使用者訪問異常的問題。
除了網域名稱快取以外,運營商的localdns還存在解析**的現象。解析**是指運營商自身不進行網域名稱遞迴解析,而是把網域名稱解析請求**到其它運營商的遞迴dns上的行為。正常的localdns遞迴解析過程是這樣的:
而部分小運營商為了節省資源,就直接將解析請求**到了其它運營的遞迴localdns上去了:
這樣的直接後果就是gslb dns收到的網域名稱解析請求的**ip還是成了其它運營商的ip,最終導致使用者流量被導向了錯誤的idc,使用者訪問變慢。
(1)如何在使用者側構造網域名稱請求:對於pc端的客戶端來說,構造乙個標準的dns請求包並不算什麼難事。但在移動端要向乙個指定的localdns上傳送標準的dns請求包,而且要相容各種ios和android的版本的話,技術上是可行的,只是相容的成本會很高。
(2)推動使用者修改配置極高:如果要推動使用者手動修改pc的dns配置的話,在pc端和手機客戶端的wifi下面還算勉強可行。但是要使用者修改在移動網際網路環境下的dns配置,其難度不言而喻。
(1)httpdns基本原理:
httpdns的原理非常簡單,主要有兩步:
a、客戶端直接訪問httpdns介面,獲取業務在網域名稱配置管理系統上配置的訪問延遲最優的ip。(基於容災考慮,還是保留次選使用運營商localdns解析網域名稱的方式)
b、客戶端向獲取到的ip後就向直接往此ip傳送業務協議請求。以http請求為例,通過在header中指定host欄位,向httpdns返回的ip傳送標準的http請求即可。
(2)httpdns優勢:
從原理上來講,httpdns只是將網域名稱解析的協議由dns協議換成了http協議,並不複雜。但是這一微小的轉換,卻帶來了無數的收益:
c、實現成本低廉:接入httpdns的業務僅需要對客戶端接入層做少量改造,無需使用者手機進行root或越獄;而且由於http協議請求構造非常簡單,相容各版本的移動作業系統更不成問題;另外httpdns的後端配置完全復用現有權威dns配置,管理成本也非常低。總而言之,就是以最小的改造成本,解決了業務遭受網域名稱解析異常的問題,並滿足業務精確流量排程的需求。
d、擴充套件性強:httpdns提供可靠的網域名稱解析服務,業務可將自有排程邏輯與httpdns返回結果結合,實現更精細化的流量排程。比如指定版本的客戶端連線請求的ip位址,指定網路型別的使用者連線指定的ip位址等。
當然各位可能會問:使用者將首選的網域名稱解析方式切換到了httpdns,那麼httpdns的高可用又是如何保證的呢?另外不同運營商的使用者訪問到同乙個httpdns的服務ip,使用者的訪問延遲如何保證?
cocos2d 全域性排程器與節點排程器
cocos2d lua 中的排程器分為以下兩種 cocos2d lua框架預設不載入全域性排程器模組。需要手動載入 local scheduler require cc.package name.scheduler 全域性排程器模組分為三個 1 全域性幀排程器 scheduleupdategloba...
容災切換必備 全域性流量管理介紹
如今人們對網際網路服務的依賴越來越重,提供低延時高可用的服務成為越來越多網際網路服務廠商的迫切需求。您是否也遇到過以下問題 1 需要降低網路耗時,卻不知道怎麼實現使用者服務的就近訪問?2 需要對服務進行灰度驗證,卻不知道如何控制各個節點的流量比重,不知道如何資源分配?3 知道保障服務的可用性非常重要...
程序排程新演算法 二級反饋佇列排程演算法
演算法基本思想 二級排程演算法是先來先服務排程演算法和優先順序排程演算法的綜合與發展。首先設定兩個就緒佇列,並且為兩個佇列賦予不同的優先順序,假設佇列2比佇列1的優先順序高 佇列2優先順序 佇列1優先順序。其次,當乙個新程序進入系統時,應先將其放入佇列1末尾,並且為佇列1中的每個程序設定乙個最大等待...