做者:凝睇,螞蟻金服移動開發平臺 mPaaS 技術專家。目前負責螞蟻金服移動開發平臺 mPaaS 服務端組件體系優化與架構設計。 內容採編自 CodeDay#1 杭州站現場分享,主題是《弱網優化在支付寶的深度實踐》。git
現場視頻: tech.antfin.com/activities/…github
隨着 PC 端場景愈來愈重,其發展已日趨飽和,而隨着智能移動設備的興起,移動互聯網呈現出了井噴式發展形態。相比於 PC 互聯網時代的有線網絡,無線網絡通訊的穩定性卻有着巨大的差異;所以,開發者總會面對用戶反饋諸如 App 「不通」、「不快」等各類「網絡問題」。算法
做爲國民級 App,支付寶須要服務在各類複雜的移動網絡環境下的億級用戶,於是在網絡優化的道路上也是一走就不少年,本文的目的便是將咱們遇到的問題作一個總結,並把在一些實際可行的優化和實踐經驗分享給各位開發者,指望能從某個角度能給各開發者提供一些靈感以幫助你們建設更好的移動 App。數據庫
問題歸總後端
網絡問題,從用戶反饋過來的表象可分爲「不通」或者「不快」,這兩詞雖然只有一字之差,但本質卻徹底不一樣:緩存
對於「不通」的問題,主要緣由爲客戶端真實網絡確實不可用或者服務端系統穩定性不足致使,從優化的角度,更偏向於優化服務端架構設計或者從交互角度讓客戶端在異常狀況如何更友好的呈現給用戶,而對於「不快」的問題,咱們則可從技術上作更多的優化和改進,於是也是本文的重點。安全
問題來源性能優化
首先咱們來看一下移動網絡的鏈路:服務器
因而可知,移動網絡自己鏈路上就相較有線網絡複雜不少,同時終端由於其強烈的「移動」屬性,在不少場景下網絡狀況確實不如人意,好比在地下室、電梯、偏遠地區等等,總會帶來帶寬不足、頻繁丟包、高延遲的問題。與此同時,在進入後端服務器應用網絡以後還有一層層的防火牆、路由器、負載均衡、IDC 分機房部署。 再到客戶端應用程序、服務端的系統設計、接口設計等問題也會極大的影響到在弱網環境下用戶的體驗,如:網絡
除此以外,傳統網絡協議在流程設計上限定,若是移動 App 自身沒有進行改良和優化,在弱網環境下也可能會成爲絆腳石。
如:
作優化必定須要有可量化的指標來衡量和記錄咱們的勞動成果和效果,所以,能夠主要從如下幾個指標入手:
其中各類指標均須要區分網絡類型(WiFi、4G、3G等等)、機型等參數進行分別監控,至於其餘的數據則可根據不一樣場景繼續延伸挖掘,並可針對諸如「當面付」等重點業務作專題分析。
在前面的章節已經有提到,根據移動網絡的特性,咱們能夠分別從網絡鏈路上,客戶端&服務端流程設計以及網絡協議上下手,在實際的操做過程當中,則經過如下幾方面開展:
網絡服務架構升級
如圖中所示,客戶端可拆分爲主進程和 Service 進程,主進程主要承載具體的功能組件和業務模塊,Service 進程則主要負責與服務端進行網絡協議和網絡數據對接,並負責進程保活。
在穿過公網、LVS、以及一系列防火牆、路由器以後,進入後端具體應用可直接感知 SLB,在這以後才正式進入咱們可操做和優化的後端架構:AccGW、ApiGW(MGS)、SyncGW(MSS)、PushGW(MPS),並由 LinkMng 來統一管理終端的鏈接信息和鏈接生命週期,移動調度這使用 MDC 配合 HTTPDNS 來完成。
AccGW
接入網關目前由 Spanner 來承接:
Spanner 是螞蟻集團基於 Nginx 二次開發的一套事件驅動型系統,其主要功能大體可分爲:
MSS 消息同步服務
在基礎服務架構升級中,MSS(SYNC)的出現一樣扮演了及其重要的角色:
在以前的文章中已經有介紹 MSS 是經過一個安全的數據通道 TCP+SSL,及時、準確、有序地將服務器端的業務數據,主動的同步到客戶端 App,其定位是一個客戶端與服務端之間的消息中間件。
MSS 主體思想是:相似 MySQL 數據庫 binlog 原理的基礎上定義了一個 oplog 概念,服務器和客戶端 SDK 之間傳遞的最小數據單元被稱爲一個 oplog,每當業務須要同步一個數據變動到指定的用戶/設備的時候,業務調用MSS服務端的 SyncData 接口,MSS 會將業務須要同步的數據變動包裝爲一個 oplog 持久化到數據庫,而後在客戶端在線的時候把oplog 推送給客戶端,若是當前則當即觸發推送。每一個 oplog 擁有一個惟一的 oplog id,oplog ID 在肯定的用戶、肯定的業務範圍內保證惟一而且單調遞增(按調用順序)。MSS 按照 oplog ID 從小到大的順序把每一條 oplog 都推送到客戶端。經過 ACK 機制服務端和客戶端均會記錄客戶端已同步數據的最大 oplog ID(亦可理解爲數據版本),後續產生新數據時進行差量計算和差量同步。
經過 MSS 能夠給客戶端帶來幾大好處:
這些優點可很是有效的減小客戶端 RPC 接口交互次數,減小須要傳輸的業務數據內容,並因爲其主動推送的特性又可極大的提高用戶的體驗效果。
移動調度
在移動調度的升級上,採用的是 MDC 配合 HTTPDNS,傳統的 DNS 有幾大弊端:
經過 MDC 配合 HTTPDNS 則能夠完美的解決以上問題:客戶端經過獨立的網絡請求到服務器拉取可用的 IP 列表,IP 列表信息中已包含了服務端的機房、中心以及白名單相關信息,客戶端在獲取到 IP 列表以後既可根據當前用戶(設備)信息在後面的網絡請求中直接路由到對應的機房、中心、某臺具體服務器或者海外 POP 加速站點。IP 列表可長期的保存在客戶端中,後續的請求中均只須要經過本地 DNS 解析便可以完成 IP 映射,用以節省 1 次 RTT 請求時間,也能夠有效的防範 DNS 域名劫持,於此同時可結合 MSS 等服務來指定實際更新策略來確保第一時間更新 IP 列表。此外,客戶端也可經過按期檢測、定製質量模型等方式來計算、評估獲取最優 IP 地址。
協議優化
MMTP:全稱螞蟻移動傳輸協議,是二進制的 TLV(類型、⻓度、值)結構的協議;是並駕於 HTTP、HTTP2.0、spdy 的私有化傳輸協議。
其主要優勢爲:
MTLS:全稱螞蟻移動安全傳輸協議是基於 TLS1.3 擴展的安全傳輸協議。
TLS1.3 可經過證書 cache、session Ticket 等機制支持 1RTT 握手,加密套件則可選用ECDHE,根據有關數據驗證,160 比特 ECC 密鑰和 1024 比特的 RSA 密鑰的安全性至關,小數據量在速度、效率、帶寬、存儲上都會體現出明顯優點,此外在某些特殊功能上,甚至可使用 0RTT 的方式直接完成數據交互。
數據優化
序列化方式:目前在螞蟻體現內已基本普及了 protobuf。Protobuf 全稱 Google Protocol Buffer,是一種輕便高效的結構化數據存儲格式,主要知足結構化數據串行化,或者說序列化。它很適合作數據存儲或 RPC 數據交換格式。可用於通信協議、數據存儲等領域的語言無關、平臺無關、可擴展的序列化結構數據格式。
而經過 protobuf 官方工具生成的客戶端文件較大,可能會引發安裝包過大,函數方法過多等問題,螞蟻內部在此基礎上又從新定製了生產工具,最終產出物被定義成 HybridPB。
ZSTD 壓縮算法:在上一代產品中業務數據 body 主要使用的 gzip 壓縮,而在目前的產品中則主要採用了 ZSTD 壓縮:
ZSTD 全稱 Zstandard,是一款免費的開源,快速實時數據壓縮程序,具備更好的壓縮比,由 Facebook 開發。 它是用 C 語言編寫的無損壓縮算法 (在 Java 中有一個從新實現) , 所以它是一個本地 Linux 程序。在移動網絡中,它能夠須要將壓縮速度交換爲更高的壓縮比率(壓縮速度與壓縮比率的權衡能夠經過小增量來配置),它具備小數據壓縮的特殊模式,稱爲字典壓縮,能夠從任何提供的樣本集中構建字典。更高的壓縮比意味着更小的網絡傳輸成本消耗,而這也是在移動端被採用的主要緣由之一。
鏈接策略
TCP 建連行爲由移動終端發起:目前主要在終端啓動時、先後臺切換時、網絡超時、鏈接錯誤或者網絡類型切換時會發生建連動做,而建聯的策略上主要由如下幾種:
對於鏈接的保持,傳統的作法就是心跳,心跳包可由客戶端發起,也可由服務端發起。因爲移動端終端的運營商、手機廠商等各類定製、非定製的因素干擾,對於 TCP 鏈接保持能力上各不相同,所以恆定的心跳時間未必能知足各類狀況,過快、過慢都會帶來問題,所以支付寶採用的是動態心跳的方式來維持鏈接,客戶端經過必定的質量模型來評估某一心跳週期的鏈接維持質量,並在過程當中逐步增長或減小心跳週期,在到一個最優的模型質量以後記錄下最優心跳時間,並用改週期時間來維持以後的一段時間。
鏈接超時控制上:除了傳統的業務請求超時和建連超時,還引入了包 sequence 概念,每一個上行包發送時,加入遞增序號,服務端收到帶序的包後,若是有下行包,就把當時收到的最大序號返回給客戶端。客戶端收到後,既可確認全部小於等於這個序號的上行包都已被服務端接受;若是某個上行包的序號在一段時間尚未收到確認,可懷疑出現「假鏈接」,須要進入回收評估階段,服務端下行包亦然。
在上面的內容中,咱們一直在基礎服務上作文章,而實際的生產過程當中,業務接口的設計也極大的影響着用戶的真實網絡體驗,而且因爲業務在持續發展,人員也持續的迭代,對於優化的規範和設計的思路上並不是都在同一水平上,所以業務治理絕對是一個須要持續堅持不懈戰鬥的過程。在業務治理過程當中也可總結爲幾個方面:
最後: 鍥而不捨。不管是性能優化、網絡優化,都是一個長期的過程,這也將伴隨着整個終端和服務端的生命週期,所以鍥而不捨的優化改進纔是重中之重。
*注(更多詳細內容):
進一步學習「protobuf」:
進一步學習「ZSTD」:
進一步學習「HPACK」:
| 移動開發平臺 mPaaS 三款組件重磅上線螞蟻金服開放平臺:
往期閱讀
《螞蟻金服 mPaaS 服務端核心組件體系概述:移動 API 網關 MGS》
《螞蟻金服 mPaaS 服務端核心組件:億級併發下的移動端到端網絡接入架構解析》
釘釘羣:經過釘釘搜索羣號「23124039」
期待你的加入~