1. 程式人生 > >分散式資料庫資料從屬與客戶端與伺服器的資料同步

分散式資料庫資料從屬與客戶端與伺服器的資料同步

老實說,目前市面上許多產品,的確是不成熟的產品。

用過一些,給人蛋痛的感覺。

導言
分佈還是集總
今天我們來探討一個很重要的問題。
每個程式設計師都有其思想,我的思想之一,就是分散式。

分散式,面對的一個問題,就資料的同步。

比如說,我們人類是分散式的,我們每個細胞都在無時無刻與其它細腦交換資料。

而現實世界,我們的設計是什麼樣子?一般都是集總式。

首先來說,這種方式,與現實世界並不一致。所以,帶來的最嚴重的一個影響就是效率的問題。

自己這些年,一直在無線通訊領域。

無線通訊,有兩個重要的特點:
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個版本後,你可以研究一下,整個演進的過程。哪個能引數被刪除了,哪些是一分為二的,哪些合併了,哪些,是你刪除了又加上,然後又刪除了的。

這種情況,有沒有?肯定有。

如果這個團隊,就你一個人,這無所謂了。

但,如果在巨大的團隊,很可能有人在偷懶,也有可能是糊塗(但更可能是管理問題)。

這麼說吧,大團隊,有意和無意的這種走轉圈路的情況,層出不窮。早晨又聽研發的同事在討論,十年前的問題。相信,再過一百年,也會再出。

現在你懂了,這個版本相容有多重要了吧?及使不考慮客戶端、伺服器,也需要有這個功能。

去年維護物流的時想,開發了一個複雜的功能,需要改動許多表,把原有的資料進行處理後匯入,後來,不得不開發了一個很複雜的升級指令碼來實現。

事實證明是明智的——手工升級,一個星期也能都升不上去,有了指令碼,只需幾分鐘。