數(shù)據(jù)同步簡介
數(shù)據(jù)同步是 mPaaS 平臺的一個核心基礎(chǔ)服務(wù)組件。數(shù)據(jù)同步源自螞蟻集團(tuán)內(nèi)面向移動應(yīng)用、從服務(wù)端到客戶端進(jìn)行海量數(shù)據(jù)推送的全鏈路解決方案 — SYNC。該組件提供了一個安全的基于傳輸控制協(xié)議(Transmission Control Protocol,簡稱 TCP)和安全套接層(Secure Sockets Layer,簡稱 SSL)的數(shù)據(jù)通道,能夠及時、準(zhǔn)確、有序地將服務(wù)器端的業(yè)務(wù)數(shù)據(jù)主動地同步(SYNC)到客戶端 App。
傳統(tǒng)的遠(yuǎn)程過程調(diào)用(Remote Procedure Call,簡稱 RPC)已立足互聯(lián)網(wǎng)行業(yè)幾十年,也能滿足絕大部分業(yè)務(wù)場景和功能需求。但在現(xiàn)階段,隨著移動互聯(lián)網(wǎng)的全面普及和發(fā)展,無論是 App 的規(guī)模還是用戶對于 App 的要求都已進(jìn)入了一個新的階段。傳統(tǒng)的 RPC 請求因其自身的特性,存在許多的不足:
客戶端在特定的場景下需要調(diào)用 RPC 請求來獲取最新的數(shù)據(jù),而服務(wù)端(云端)實際沒有或僅有少量數(shù)據(jù)發(fā)生變化。
在客戶端啟動時,不同的業(yè)務(wù)模塊、業(yè)務(wù)功能因設(shè)計上的獨立,需要分別進(jìn)行 RPC 請求來完成各自業(yè)務(wù)的數(shù)據(jù)拉取。
客戶端無法及時感知服務(wù)端發(fā)生的數(shù)據(jù)變化,只能通過定時輪詢 RPC 接口的方式來刷新數(shù)據(jù)。
傳統(tǒng) RPC 大多基于 HTTP(S) 的短連接進(jìn)行數(shù)據(jù)交互,連接上即使使用 keepalive 等特性也無法長期保持連接,無法做到鏈路持續(xù)復(fù)用。請求創(chuàng)建連接、證書交換、加解密等對網(wǎng)絡(luò)耗時及性能都會帶來不小的損耗。
為改善或解決上述問題,數(shù)據(jù)同步應(yīng)運而生。
功能特性
數(shù)據(jù)同步具備以下特性:
可靠同步
針對業(yè)務(wù)要求的 QoS(Quality of Service)等級為必達(dá)的業(yè)務(wù)場景而言,數(shù)據(jù)同步保證只要用戶在該數(shù)據(jù)有效期內(nèi)活躍并且符合業(yè)務(wù)推送要求的條件(如客戶端版本號、操作系統(tǒng)類型等維度),就一定能使客戶端同步到業(yè)務(wù)推送的數(shù)據(jù)。
增量有序
數(shù)據(jù)同步保證同一個通道內(nèi)到達(dá)客戶端的消息順序一定是與業(yè)務(wù)服務(wù)器調(diào)用數(shù)據(jù)同步服務(wù)器的順序一致,并且所有消息以增量方式同步至客戶端。
高實時性
當(dāng)客戶端連接的網(wǎng)絡(luò)狀況良好時,數(shù)據(jù)同步可以保證非常高的推送實時性,消息推送耗時幾乎是純網(wǎng)絡(luò)傳輸?shù)暮臅r(1s 之內(nèi)送達(dá))。
基本原理
類似于 MySQL 的 binlog 機制,數(shù)據(jù)同步服務(wù)器和客戶端 SDK 之間傳遞的基本數(shù)據(jù)單元為 oplog,當(dāng)業(yè)務(wù)需要同步一個變更數(shù)據(jù)到指定的用戶或設(shè)備時,業(yè)務(wù)調(diào)用數(shù)據(jù)同步接口,數(shù)據(jù)同步服務(wù)端會將業(yè)務(wù)需要同步的數(shù)據(jù)變更包裝為一個 oplog 持久化到數(shù)據(jù)庫,然后當(dāng)客戶端在線時,將 oplog 推送給客戶端。每個 oplog 擁有一個唯一的 oplog id,oplog id 在確定的用戶、確定的業(yè)務(wù)范圍內(nèi)保證唯一并且單調(diào)遞增(按調(diào)用順序)。數(shù)據(jù)同步服務(wù)端會按照 oplog id 從小到大的順序把每一條 oplog 都推送至客戶端。數(shù)據(jù)同步服務(wù)端和客戶端都會記錄客戶端已經(jīng)收到的最大 oplog id,稱為同步點(亦可以被理解成數(shù)據(jù)版本號)。
價值優(yōu)勢
合并推送
客戶端初始化成功時,服務(wù)端可一次性推送多個業(yè)務(wù)數(shù)據(jù),減少不同業(yè)務(wù)的請求。
增量推送
只在有增量數(shù)據(jù)時才推送業(yè)務(wù)數(shù)據(jù),可有效減少冗余數(shù)據(jù)的傳輸,降低網(wǎng)絡(luò)成本。
減少請求
在沒有增量數(shù)據(jù)時,不會消耗請求成本,減少業(yè)務(wù)的冗余請求。
提高時效
當(dāng)服務(wù)端發(fā)生數(shù)據(jù)變化時,可在最短時間內(nèi)將變化數(shù)據(jù)直接推送至客戶端,無需等待客戶端請求。
提升體驗
數(shù)據(jù)無感知推送,在渲染客戶端界面之前,數(shù)據(jù)已到位,降低了用戶等待時間。
使用場景
數(shù)據(jù)同步可應(yīng)用于客戶端內(nèi)需要實時推送數(shù)據(jù)的業(yè)務(wù)場景,如轉(zhuǎn)賬結(jié)果推送、支付結(jié)果推送、消息中心等。您可以通過以下場景對數(shù)據(jù)同步的能力有更深入了解。
在即時通訊 App 中,數(shù)據(jù)同步提供增量、可靠的消息觸達(dá)能力,將聊天消息按發(fā)送方的發(fā)送順序,有序推送至指定用戶。
在需要動態(tài)更新配置的 App 中,數(shù)據(jù)同步可以動態(tài)地將配置信息進(jìn)行全設(shè)備推送。將 App 功能開關(guān)、動態(tài)參數(shù)、動態(tài)配置等信息實時推送至指定客戶端,或者批量動態(tài)地改變 App 在運行期間的業(yè)務(wù)參數(shù)、業(yè)務(wù)配置。
在支付類 App 中,數(shù)據(jù)同步能夠為交易數(shù)據(jù)的在線推送提供安全數(shù)據(jù)通道,保證在線 App 可實時接收推送數(shù)據(jù)。同時數(shù)據(jù)同步還能夠提供數(shù)據(jù)持久化能力,使 App 在下一次上線時收到不在線期間的推送數(shù)據(jù)。