攜程APP好用的秘訣大起底 告訴你APP性能優化也有捷徑可走!
攜程無線網絡服務通道架構
陳浩然介紹了2016年年初攜程無線網絡服務通道的架構圖,其中無線APP有兩個通道,一是Native,基于TCP設計的一套網絡服務通道,連了TCP Gateway;二是Hybrid,用GS寫界面,最后是通過傳統的HTTP請求到達HTTP Gateway,TCP Gateway和HTTP Gateway最終鏈接到對應的SOA服務。
陳浩然表示,APP端是通過TCP連接連到TCP Gateway,轉化后通過HTTP請求轉化到后端一個標準的SOA接口當中,是一個標準的HTTP協議,前端通過TCP連接。
他在演講中表示,TCP協議是傳統協議,位于第三層,只控制網絡層的傳輸協議,到了應用層還是需要設計一層應用層協議,類似RPC機制。攜程的TCP Gateway分為兩個部分,第一部分是在接入層管理TCP連接,主要基于Netty實現,負責App端TCP連接管理。第二部分是在路由層,基于Netty Zuul對服務進行路由、監控、安全、鑒權方面的管理。“實現方式就是一個可插件式的中間件,不同插件實現不同功能,如路由、安全、鑒權,數據格式最新的是基于Protocol Buffers實現的。”
HTTP Gateway功能較為簡單,直接負責HTTP請求轉發,路由層也是基于Zuul實現,功能上和TCP Gateway非常接近,數據格式就是傳統JSON數據格式。
之所以需要Gateway,陳浩然解釋道,因為攜程業務很多,目前有20多個事業部,每個事業部有自己的服務集群,如果將所有的服務集群耦合在一起,每個BU的發布都會影響到其他BU。而設置Gateway進行服務轉化,后端所有業務邏輯是完全分割開來的,相應的部署、發布、監控都是完全割離開來的,這樣可以避免干擾,提升效率。
TCP與HTTP協議優劣勢對比
談及為什么要基于TCP實現時,陳浩然認為,主要是與HTTP協議對比得出的結論。HTTP協議優勢非常明顯,封裝性好,HTTP協議更標準化,客戶端和服務端解決方案相對成熟。但是劣勢在于可控性很差,受網絡影響嚴重,像HTTP1.1協議里的KeepAlive、Pipeline這些機制很難發揮作用。
而 TCP協議做網絡服務,優勢是可以針對網絡連接、發送請求和接受響應,不同階段可以完全分割很清楚,可以針對不同階段做定制性優化。劣勢是實現很復雜,因為要實現自己的應用層協議,開發成本和復雜度都比較高。
優化APP網絡服務全生命周期
陳浩然表示,App對網絡環境要求較高,不同的網絡類型帶寬和延遲差別非常大,其中延遲對網絡性能影響最大。雖然服務端做了很多優化,但是如果網絡性能不佳,依然會帶來較大延遲,優化效果不如在App端做優化更好。
陳浩然將App網絡服務生命周期劃分為六個部分:一是DNS解析,二是建立連接,三是序列化網絡請求報文,四是發送網絡請求,五是接受網絡響應,六是反序列化網絡響應報文。“攜程的做法是把生命周期每個步驟都進行細化,針對每個階段進行優化。”
DNS解析的優化
DNS解析階段有三個問題:一是解析有1%失敗概率,二是域名解析地址影響網絡服務,三是解析耗時容易產生延遲。
DNS解析優化有兩種解決方案:一種是自建HTTP-DNS,用IP地址訪問,發一個HTTP請求上來訪問DNS服務器,可以根據客戶端IP地址,告訴最合適服務端的IP地址是多少,但服務端開發部署成本比較高,而且第一次還是要發HTTP-DNS服務,前置服務帶來額外延遲。第二個解決方案是在App端內置服務器IP列表,徹底取消DNS解析,但是客戶端如何能夠快速知道哪個服務端IP地址最好,需要自行判斷。
攜程采取的解決方法是在App內置服務IP列表,每個IP都有一個權重機制,會根據每次網絡服務選擇權重最高的IP地址。IP權重如何計算?攜程在客戶端用Ping值,每個服務IP啟動之后立刻進行Ping值,根據Ping值的延遲時間進行計算,Ping值最低的權重最高,如果Ping不通可能是權重為零,最差的服務端地址。在網絡環境切換時,IP權重會重新計算。
TCP連接的優化
這方面優化的重點是保持長連接。如果每次都建立連接整體耗時會非常大,用戶體驗非常差。攜程的做法是配置一個TCP長連接池,專門用來存放長連接,根據網絡環境不同更新連接池大小的上線。每次網絡服務要發一個網絡請求,用戶點擊查詢,會優先從長連接中拿出一個空閑長連接出來進行網絡服務,發完收到響應一切都成功了,會再將空閑長連接放回到連接池當中,等待下一次網絡服務發起。如果TCP長連接服務失敗,也會用短連接進行重試,會有一些限制條件,實際上是長短結合的概念。為了簡單處理目前還沒有支持Pipeline或者是Multiplexing機制。
弱網和網絡抖動情況優化
攜程會根據網絡類型以及端到端的Ping值進行計算,首先將當前網絡質量劃分為好、中、差、非常差四類網絡質量參數,然后根據參數調整長連接個數,在4G/WIFI會增加長連接池大小,目前長連接池是四個。其次根據網絡質量參數調整TCP連接、發送請求,以及調整write或者read的超時時間。第三個方法是當網絡類型切換時,一旦客戶端IP變化,直接關閉所有長連接,現有正在發的網絡服務會進行自動重試。
數據格式優化
陳浩然表示,之前攜程App是使用自定義數據格式。后來調研了Protocol Buffers、Flat Buffers、Thrift這幾種比較常見的格式,最終選用了Protocol Buffers。在攜程特定的數據類型下,數據包大小可以降低,相對于之前的數據格式大小降低了20%-30%。序列化、反序列化時間也是可以降低10%-20%。如果大家自己開發這樣一個網絡協議,數據格式主要是考察兩點:一個是數據包大小,一個是序列化和反序列化時間。數據包大小更重要,因為如果數據包太小,網絡服務在傳輸過程中非常耗時。
“我的感觸主要有兩點:一是盡量減少網絡連接時間,第二個盡量減少傳輸Size,盡量減少網絡帶寬和延遲的影響,延遲是必不可免的,帶寬是受限制的,數據量越小越好,同時也是連接越少越好。”陳浩然總結道。
他認為選擇格式和自身業務類型相關,Flat Buffers更適合于社交關系型數據存儲。而Thrift不單單是一個數據格式的解決方案,更多是IPC解決方案,包含了一個完整IPC解決方案。陳浩然告訴聽眾,非死book的App就使用Flat Buffers,用于本地數據Modle存儲。
網絡服務重試機制
攜程發現所有網絡服務失敗原因中有90%都是因為TCP連接失敗。連接失敗是否可以進行重試?陳浩然認為重試更多需要考慮可靠性問題,服務是否有冪等性問題,需要自己去解決。
攜程在這方面的經驗是如果在建立連接、序列化網絡請求報文,包括發送網絡請求這三個階段失敗,則直接進行重試,并不需要業務程序來通知需要重試。另外也可以自行確保服務冪等性,添加重試參數。“攜程目前網絡服務成功率已經從95.3%增長到99.5%。”陳浩然告訴聽眾。
Hybrid網絡性能優化
傳統Hybrid網絡服務基于系統接口,無法控制網絡流程,平均網絡服務成功率僅為97%左右,攜程想了兩個方案:一是攔截所有HTTP請求進行直接轉發。二是用Hybrid網絡接口方式進行轉發。最終攜程選擇了第二個方案。
通過這張圖可以看出,發一個網絡請求是走Hybrid接口,由Native發一個TCP連接到TCP Gateway,并不知道TCP這個通道存在,還是正常發一個網絡請求,是Get還是Post,告訴Hybrid庫要發HTTP請求,以為還是HTTP請求,到Hybrid框架這一層,現在知道要發一個HTTP請求,把HTTP請求所有參數作為一個正常的TCP服務,傳到TCP Gateway,這一層解析出服務號之后,其實要發HTTP請求,會拼接成一個正常的HTTP請求,再發到HTTP Gateway。對于HTTP Gateway而言,并不知道HTTP請求是從傳統Hybrid還是H5網站發來的HTTP請求,還是從TCP Gateway這一層發送的請求,對HTTP Gateway不需要做任何改造動作。只不過在HTTP端Hybrid網絡層和TCP Gateway做一些改造,這樣HTTP請求做一個通道的動作去做協議轉發。HTTP Gateway把包裝過的HTTP請求轉發到后端服務器之后,服務端響應之后會把相應HTTP響應報文再傳給TCP Gateway,再會重新打包成一個正常攜程協議TCP響應報文給客戶端,會再把這個報文解開,類似于把一個HTTP請求發送完了,得到響應概念,再傳給Hybrid業務層。需要做的改造只是針對HTTP里Hybrid網絡發送接口需要進行改造,包括TCP Gateway要加一個功能。對于業務端,傳統Hybrid業務層面開發者完全不需要知道這一層,HTTP Gateway也不需要這一層,對于業務來說是完全透明。
通過這樣的通道架構,所有HTTP請求都會通過TCP Gateway進行中轉,中轉到HTTP Gateway,對于業務是完全透明的,平均網絡服務成功率已經提升到了99.2%,同時還把網絡服務耗時降低了30%。
海外網絡性能優化
攜程在海外沒有IDC,除了CDN靜態資源之外,業務服務所有的請求都需要回源,速度非常慢。如何破?
攜程采用了Akamai(全球最大的CDN廠商解決方案),有一個專署通道,到海外可以走Akamai專署通道,而不是傳統Internet路由線路到達服務端。如果海外用戶登錄,Akamai通過定制域名獲取服務端IP,之后所有網絡服務會優先走Akamai通道,然后直接落地到攜程IDC,不需要再走傳統聯通、電信運營商通道。當然陳浩然也表示,Akamai通道不是萬能的,但平均耗時可以減少到30%,比傳統Internet通道優化很多。
最新的無線網絡服務通道架構圖,不管Hybrid還是Native,都是走TCP連接做網絡服務,Hybrid有一個內部API來控制去發送網絡請求,不需要再讓系統來控制HTTP請求到HTTP Gateway,而只是全部用Native TCP連接到TCP Gateway,如果是Hybrid請求被包裝過了,就轉成HTTP請求到HTTP Gateway,如果是正常TCP請求就直接發送到對應后端服務,這是最新的網絡服務通道。
本文由陳浩然于2016年8月,在WOT2016移動互聯網技術峰會性能專場《無線App網絡服務通道治理和性能優化》主題演講整理而成。WOT2016大數據峰會將于2016年11月25-26日在北京粵財JW萬豪酒店召開,屆時,數十位大數據領域一線專家、數據技術先行者將齊聚現場,在圍繞機器學習、實時計算、系統架構、NoSQL技術實踐等前沿技術話題展開深度交流和溝通探討的同時,分享大數據領域最新實踐和最熱門的行業應用。
來自:http://network.51cto.com/art/201610/518594.htm