分散式資料庫資料從屬與客戶端與伺服器的資料同步
老實說,目前市面上許多產品,的確是不成熟的產品。
用過一些,給人蛋痛的感覺。
導言
分佈還是集總
今天我們來探討一個很重要的問題。
每個程式設計師都有其思想,我的思想之一,就是分散式。
分散式,面對的一個問題,就資料的同步。
比如說,我們人類是分散式的,我們每個細胞都在無時無刻與其它細腦交換資料。
而現實世界,我們的設計是什麼樣子?一般都是集總式。
首先來說,這種方式,與現實世界並不一致。所以,帶來的最嚴重的一個影響就是效率的問題。
自己這些年,一直在無線通訊領域。
無線通訊,有兩個重要的特點:
1. 無線頻寬有限,所以這些頻寬就成為重要的國家資源,所以無線通訊的費用,很高。
2. 無線通訊,訊號不穩定。
當然,wifi是另一回事,但不是哪裡都可以用wifi接入。至少現在是這樣(當然,wifi的存在,也是一個莫大的諷剌:國際電聯佔用了那麼多頻寬,可真正傳的資料,可能根本不如開放給Wi-Fi的那麼一點可憐的頻寬。國際電聯,有時真是應當反思)。
基於這兩點,一個手機電的客戶端應用程式,一定要在本地存資料。如果不能做到這樣,其本上就是個垃圾產品。浪費生命的產品。
舉個例子,比如騰訊新聞,其實這是一個實時性很強的產品,但騰訊,還是非常負責地實現了全面的離線和快取功能。這是對使用者的負責。
使用者沒有道理,在等你的軟體在後臺同步資料。這是在浪費使用者 的生命。
同步與版本相容
但是同步並不是件簡單的工作,事實上,相當複雜,而且是檢查一個架構師的架構是否合理的關鍵要點。
網上有許多討論同步的帖子。但都不是很理想。
同步,作為一個架構人員,你首先要考慮同式的方式。進而思考版本相容的問題。
什麼叫版本相容?這麼說吧,你去理髮,看一個理髮師水平怎麼看?過一個星期再看他給你理的發的效果,那才是真水平。
版本相容,事實上,是真正能體現一個複雜軟體的靈魂之處。
特別是對資料的相容。
我為什麼總是把這四個字放在嘴邊?因為這不止是我缺的,更是我們整個民族所缺的。我們五千年文化的特點是什麼?每300年大掃除一次!每個朝代的書,都被下個朝代燒光。所以,我們總是在原地踏步。
然後,美其名日:新的版本完全拋棄了舊版本的弊端。
我告訴你,這樣的軟體,送我也不要——缺少一個程式設計師的其本良知。
同樣,一個公司,你怎麼看他強不強?你就看他的產品升級的時候,是怎麼處理使用者資料的。
比如,目前我維護的任務之一就是Pre-E公司的windchill ,PDM系統,不論你告訴我這是一家多麼強大的公司,當我聽說,它的新版本不能從舊版本平相容升級,需要完全重做,我就知道,這是個不能買的軟體——windchill團隊,也是個不怎麼負責的團隊——也可能是能力問題。
那麼,版本相容、分散式、資料、同步,它們之間的聯絡是什麼?
真的思考過的人,你自然會理解。、
你精心設計的CS系統(比如OA,流程平臺,CRM,物流,等等),現在資料庫結構變了。
問題是,你的客戶端那裡,有一個本地資料庫,存在屬於他的資料。
那麼,這兩個資料庫之間,如何處理?
當然,最簡單的辦法就是通知所有使用者:你的資料不能用了,請重新同步。
這是一種浪費。對伺服器的壓力,也會增加很多。
事實上,我瞭解過的許多系統,伺服器的壓力,就是因為伺服器承擔了本不需要在服務端完成的工作。
現在的手機、PC運算能力,完全是一個小型伺服器。
有時的確搞不懂,人們為什麼無節制地在服務端搞來搞去,而不是從分散式的思想上下功夫——其實這也是一種民主暴政:搞服務端看起來很專業,很有型,工資自然高。
浪費所以總是有道理。
但,錯誤,總會有人來糾正的。
——————————————
好了,我們來探討,資料同步的一些細節。
資料同步,由幾部分構成。
1. 資訊的從屬。這可能是最先需要思考的。
有屬於個人的,有屬於團隊的,有公共的,有屬於BI團隊的,還有屬於管理人員,或是財務這種專業團隊的。
所以,第一步,需要明確介面哪些需要同步每個個體的終端(User Equment)上.
2. 資訊的唯一描述。
有了從屬,每一條資訊,需要一個唯一ID。
以解決當一條資訊發生改變時的記錄。服務端與客戶端,都需要此項工作。
3. 資料結構的描述,與版本。
為實現版本相容,每個物件(或表,或樹)需要有描述(類似人類的DNA,類似資料庫的Schema),這些描述體系,相對而言,需要固定的模式。
比如,資料庫,一定是非業務、非物件、非表的模式來儲存。比如,可以用OID + value的方式來儲存。
4. 資料的同步,需要兩步,第一步是檢查資料結構是否有改變,第二步才是資料的同步。
5. 注意這裡軟體的版本升級,與資料描述的演進,是兩回事。
6. 另一個要選擇的問題,何時同步,同步多少資料。比如,當用戶用到一個功能時,再同步,還是使用者每登上,就進行一次全同步。
這裡,需要與具體的情況結合來考慮。最好是兩種功能,都實現,不同的情況下,使用不同的同步方式。
7. 實時上報。當兩個使用者在進行協同時,最好需要有實時上報的功能。這裡看以看出,為什麼,資訊的從屬,和資訊的唯一描述,是這同步體系的基礎。
8.容錯,當體系出現問題時,有機缺能避免掉入升級陷阱。
9.區分wifi與電信網路的接入情況。當用戶使用的是wifi時,可以在後臺自動進行全同步。
如果能實現這些,其本上就比較理想了。
平滑升級,為什麼如此重要?
幾個方面。
一個是版本的回溯。
版本回溯的重要性是什麼呢?
好比我們早晨醒來第一件事是什麼?回憶。不錯,可能你沒有意識到。
我們中國人學的英語為什麼都是啞巴英語?一方面,我們沒有注意到語言的核心是動詞,另一方面,也是根本原因,是因為我們沒有形成英語記憶。
這是母語與後天習成語言的本質差別。
版本回溯的重要,類似於此。
比如說,你的軟體升級20個版本後,你可以研究一下,整個演進的過程。哪個能引數被刪除了,哪些是一分為二的,哪些合併了,哪些,是你刪除了又加上,然後又刪除了的。
這種情況,有沒有?肯定有。
如果這個團隊,就你一個人,這無所謂了。
但,如果在巨大的團隊,很可能有人在偷懶,也有可能是糊塗(但更可能是管理問題)。
這麼說吧,大團隊,有意和無意的這種走轉圈路的情況,層出不窮。早晨又聽研發的同事在討論,十年前的問題。相信,再過一百年,也會再出。
現在你懂了,這個版本相容有多重要了吧?及使不考慮客戶端、伺服器,也需要有這個功能。
去年維護物流的時想,開發了一個複雜的功能,需要改動許多表,把原有的資料進行處理後匯入,後來,不得不開發了一個很複雜的升級指令碼來實現。
事實證明是明智的——手工升級,一個星期也能都升不上去,有了指令碼,只需幾分鐘。