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