多終端數(shù)據(jù)同步機(jī)制設(shè)計(jì)(二)
Intro
如果您沒(méi)有看上一篇文章粉渠,建議您先移步到這里查看 第一部分
上一次主要解決了基本的數(shù)據(jù)增量同步的問(wèn)題漏策,但仍然存在一些問(wèn)題。
可能存在的主要問(wèn)題:
- 大數(shù)據(jù)量傳輸時(shí)只估,數(shù)據(jù)在傳輸過(guò)程出現(xiàn)部分丟失志群,數(shù)據(jù)不完整
- 超大數(shù)據(jù)量需要同步,導(dǎo)致響應(yīng)時(shí)間過(guò)長(zhǎng)而導(dǎo)致連接超時(shí)
針對(duì)以上可能出現(xiàn)的這兩個(gè)問(wèn)題蛔钙,需要對(duì)數(shù)據(jù)進(jìn)行校驗(yàn)并且數(shù)據(jù)量超過(guò)一定量時(shí)進(jìn)行分批量傳輸锌云,
本文將著手解決 數(shù)據(jù)校驗(yàn) 和 數(shù)據(jù)分批次傳輸 這兩個(gè)問(wèn)題。
同步流程概覽
結(jié)合之前的同步流程吁脱,加上數(shù)據(jù)校驗(yàn)和分批次傳輸數(shù)據(jù)桑涎,大概流程如下:
客戶端調(diào)用服務(wù)器端的 Pull
接口從服務(wù)器端拉取數(shù)據(jù)彬向,
如果本地版本號(hào)等于服務(wù)器端最新版本號(hào),則已更新的最新版本攻冷,
如果本地版本小于服務(wù)器端最新的版本號(hào)娃胆,則拉取需要更新的數(shù)據(jù),服務(wù)器端返回?cái)?shù)據(jù)的同時(shí)會(huì)返回本地傳輸?shù)臄?shù)據(jù)的一個(gè)校驗(yàn)值等曼,
客戶端獲取到服務(wù)器端響應(yīng)時(shí)先根據(jù)接收到的數(shù)據(jù)計(jì)算校驗(yàn)值里烦,計(jì)算出來(lái)之后與服務(wù)器端返回的校驗(yàn)值進(jìn)行比較,
如果本地計(jì)算的校驗(yàn)值與服務(wù)器端返回的校驗(yàn)值一致則進(jìn)行更新客戶端本地?cái)?shù)據(jù)禁谦,不一致則視為無(wú)效數(shù)據(jù)胁黑,重新請(qǐng)求 Pull
接口。
更新到最新版本之后枷畏,判斷本地是否存在未提交的版本别厘,如果本地不存在修改則本次數(shù)據(jù)同步完成,如果本地存在修改拥诡,則提交本地修改触趴,提交本地?cái)?shù)據(jù)的之前要先計(jì)算傳輸數(shù)據(jù)的校驗(yàn)值,校驗(yàn)值和本地?cái)?shù)據(jù)一起傳給服務(wù)器端 Push
接口渴肉。
服務(wù)器端 Push
接收到客戶端請(qǐng)求之后需要進(jìn)行數(shù)據(jù)校驗(yàn)冗懦,根據(jù)傳輸?shù)臄?shù)據(jù)計(jì)算校驗(yàn)值并與客戶端傳的校驗(yàn)值比較,
如果兩個(gè)值不一致仇祭,則視為數(shù)據(jù)在傳輸過(guò)程中發(fā)生丟失或是異常數(shù)據(jù)披蕉,則不處理并返回客戶端,本次請(qǐng)求屬于異常請(qǐng)求乌奇。
如果兩個(gè)值一致没讲,再進(jìn)行數(shù)據(jù)處理,處理結(jié)束之后礁苗,數(shù)據(jù)會(huì)有一個(gè)返回狀態(tài)和其他必要的屬性爬凑,根據(jù)數(shù)據(jù)計(jì)算校驗(yàn)值,與從服務(wù)器拉取數(shù)據(jù)時(shí)類似试伙,不再贅述嘁信,
客戶端數(shù)據(jù)校驗(yàn)通過(guò)之后,根據(jù)服務(wù)器端處理狀態(tài)進(jìn)行本地?cái)?shù)據(jù)的更新疏叨。
下面展示添加數(shù)據(jù)校驗(yàn)后的主要流程圖:
服務(wù)器端獲取數(shù)據(jù):
客戶端拉取數(shù)據(jù):
服務(wù)器端更新數(shù)據(jù):
客戶端推送更新數(shù)據(jù):
數(shù)據(jù)校驗(yàn)
數(shù)據(jù)校驗(yàn)潘靖,我們用的是MD5進(jìn)行校驗(yàn),取傳輸數(shù)據(jù)的MD5蚤蔓,使用MD5有兩方面的考慮:
一方面因?yàn)镸D5生成的字符串不算太長(zhǎng)卦溢,不會(huì)影響傳輸?shù)臄?shù)據(jù)量,
另一方面也是因?yàn)镸D5比較通用一些,APP端實(shí)現(xiàn)起來(lái)也比較方便既绕。
數(shù)據(jù)分批傳輸
數(shù)據(jù)分批次傳輸啄刹,自己感覺(jué)這里實(shí)現(xiàn)的比較 LOW ,這里類似于網(wǎng)站上的分頁(yè)凄贩,沒(méi)想到更好的解決方案誓军,期待大神分享更好的解決方案。
返回客戶端 當(dāng)前請(qǐng)求數(shù)據(jù)頁(yè)碼索引 和 本次數(shù)據(jù)傳輸總頁(yè)數(shù)疲扎,如果頁(yè)碼索引小于總頁(yè)數(shù)昵时,則頁(yè)碼索引+1,再請(qǐng)求一次接口知道返回的頁(yè)碼索引等于總頁(yè)數(shù)椒丧。
End
最后壹甥,這個(gè)設(shè)計(jì)一定還存在著不足,希望大神看到能給出自己的看法和意見(jiàn)壶熏,有不正確的地方還希望能夠告知句柠。
整個(gè)同步流程設(shè)計(jì)的流程圖,點(diǎn)我下載
另如果你有別的方案歡迎共同討論棒假,希望大神看到能給出自己的看法和意見(jiàn)溯职,有不正確的地方還希望能夠告知。