????????之前談到數(shù)據(jù)同步朋贬,但我們知道,業(yè)務(wù)服務(wù)使用的數(shù)據(jù)和存儲的數(shù)據(jù)是不完全一樣窜骄。服務(wù)用到的數(shù)據(jù)是存儲數(shù)據(jù)集合或者混合衍生集合的子集锦募。因此,進(jìn)程之間數(shù)據(jù)的同步更像是物化視圖的同步邻遏。除了Oracle外糠亩,mysql對物化視圖并沒有很好的支持虐骑。而且文件和NoSQL類的數(shù)據(jù)管理系統(tǒng),也有類似的子集同步需求赎线。
????????子集同步本身廷没,我們需要將這個過程分成幾個步驟。首先是內(nèi)存中數(shù)據(jù)同步垂寥,其次是靜態(tài)數(shù)據(jù)的篩選颠黎,最后是增量數(shù)據(jù)的篩選。當(dāng)子集被篩選出來后矫废,在同步技術(shù)上和數(shù)據(jù)同步這個節(jié)所提到的數(shù)據(jù)庫和靜態(tài)文件同步技術(shù)盏缤,并沒有本質(zhì)上的差別砰蠢。不同的是蓖扑,子集同步多出一個步驟篩選。子集因為存在篩選台舱,所以在范圍上和數(shù)據(jù)同步是不一樣的律杠。數(shù)據(jù)親和架構(gòu)一直強(qiáng)調(diào),進(jìn)程和數(shù)據(jù)綁定竞惋,架構(gòu)自動同步進(jìn)程需要的數(shù)據(jù)柜去,而子集所定義的數(shù)據(jù)范圍才真正是進(jìn)程所需要的數(shù)據(jù)。因此拆宛,子集同步才是真正有意義嗓奢,是進(jìn)程所需要的數(shù)據(jù)同步。
????????篩選觸發(fā)的增量和存儲觸發(fā)的增量浑厚,在技術(shù)上有很大的問題股耽。存儲觸發(fā)的增量在實踐中比較簡單,原始數(shù)據(jù)和變更后的數(shù)據(jù)存儲在同一個地方钳幅,兩者直接對比物蝙,就可以發(fā)布變更的數(shù)據(jù)。篩選則不同敢艰,篩選包括四個步驟:(1)捕獲原始數(shù)據(jù)的變更诬乞;(2)原始數(shù)據(jù)條件判斷;(3)原始數(shù)據(jù)的字段選擇钠导;(4)和同一記錄的上一次結(jié)果比對差異震嫉。與此同時,篩選計算是在內(nèi)存中完成的牡属,和結(jié)果存儲通常不是在一個地方票堵,只有在計算結(jié)果和上次存儲結(jié)果存在差異,才被認(rèn)為發(fā)生了變更湃望。子集的增量變更因為存在上述兩點换衬,導(dǎo)致難度要高于全集的增量變更痰驱。在市面上,并沒有完成這個功能的現(xiàn)成組件瞳浦。
????????子集的增量是基于存儲增量變化的流式變化担映,在加上篩選,從廣義上來看叫潦,可以視為一種流式計算蝇完。但從業(yè)務(wù)開發(fā)者角度來看,卻不能視之為一個流式計算矗蕊,因為他需要更為簡單的接口和實現(xiàn)方式短蜕,如SQL語法。在數(shù)據(jù)親和架構(gòu)的設(shè)計之初傻咖,就是從業(yè)務(wù)開發(fā)這角度來思考這個問題朋魔,因此,如何提高開發(fā)效率也是一個重要的考慮因素卿操。