很多人都看過 DDD, 從2002 年開始在中國開發(fā)者社區(qū)已經(jīng)炒的沸沸揚(yáng)揚(yáng),但直到現(xiàn)在有多少家公司是這么做的?實(shí)話,我自己沒用DDD,也是用數(shù)據(jù)庫驅(qū)動開發(fā)的,即以數(shù)據(jù)設(shè)計(jì)為中心,至少從思想上是這樣的。雖然我上一個(gè)公司的開發(fā)模式是用----- 用例模型-》服務(wù)對象-》業(yè)務(wù)對象-》數(shù)據(jù)對象----這樣一個(gè)過程。但分析的實(shí)質(zhì)還是以數(shù)據(jù)設(shè)計(jì)為中心,只能說是弱弱的DDD吧,批著DDD,實(shí)則是以數(shù)據(jù)庫中心。
----------------------------------數(shù)據(jù)庫以死-------------------------------------------------------------------------------
原文地址:http://www.jdon.com/artichect/dbdead.htm
現(xiàn)代軟件和以往傳統(tǒng)軟件主要區(qū)別在于:現(xiàn)代軟件基于internet互聯(lián)網(wǎng)技術(shù),運(yùn)行于開放的網(wǎng)絡(luò)環(huán)境,不象傳統(tǒng)軟件只是運(yùn)行在封閉的局域網(wǎng),運(yùn)行環(huán)境的區(qū)別就決定了軟件操作用戶的多少,在一個(gè)開放互聯(lián)網(wǎng)環(huán)境, 你的軟件系統(tǒng)用戶是不斷增長,特別是那些對所有人群開放的社區(qū)網(wǎng)站系統(tǒng),更是承受前所未有的訪問負(fù)載。那么,這些軟件系統(tǒng)承受的壓力主要會集中在軟件的哪個(gè)環(huán)節(jié)呢?如果你使用傳統(tǒng)軟件的設(shè)計(jì)思路,那么無疑壓力都集中在數(shù)據(jù)庫上。
隨著用戶的爆發(fā)量增長,在某個(gè)凌晨醒來時(shí),你發(fā)現(xiàn):數(shù)據(jù)庫已死。
傳統(tǒng)軟件系統(tǒng)實(shí)則應(yīng)該叫數(shù)據(jù)庫軟件系統(tǒng),是一個(gè)數(shù)據(jù)庫系統(tǒng),開發(fā)這樣的系統(tǒng)非常簡單,成本 也非常低廉,只要根據(jù)需求先設(shè)計(jì)好數(shù)據(jù)表結(jié)構(gòu),然后,就找一些大學(xué)畢業(yè)生寫大量SQL語句,雖然還使用 JAVA/PHP/.NET等語言,但實(shí)際上這些語言只是將SQL送往數(shù)據(jù)庫執(zhí)行的運(yùn)輸工,沒有什么價(jià)值和地位。
所以,這樣的系統(tǒng)運(yùn)行在互聯(lián)網(wǎng)環(huán)境下以后,主要負(fù)載就集中在數(shù)據(jù)庫的SQL運(yùn)行上,也就是說:整個(gè)軟件系統(tǒng)性能關(guān)鍵點(diǎn)就集中在數(shù)據(jù)庫上了,數(shù)據(jù)庫是性能主角,是王者;雖然你購置了昂貴的Websphere/weblogic等應(yīng)用服務(wù)器,但是由于Java只是運(yùn)輸工,根本起不到性能上負(fù)載分擔(dān)的作用。
著名的社區(qū)網(wǎng)站MySpace就是因?yàn)橐粋€(gè)好的idea,用戶瘋狂增長,但是系統(tǒng)卻不能平滑承受增長的用戶訪問,這些用戶訪問網(wǎng)站緩慢、無法訪問甚至丟失數(shù)據(jù),他們經(jīng)過幾次傷筋動骨的架構(gòu)升級,在微軟SQLServer直接技術(shù)支持下, 好容易才勉強(qiáng)應(yīng)付過去。看看他們痛苦經(jīng)歷,你是否也愿意再來一次呢?詳細(xì)情況: http://www.jdon.com/jivejdon/thread/34601.html
從中可以看出,數(shù)據(jù)庫性能微調(diào)和挖潛總是有限度的,對數(shù)據(jù)庫性能優(yōu)化提高性能的步伐永遠(yuǎn)趕不上用戶增長量, 有人也提出數(shù)據(jù)庫集群的概念,其實(shí)數(shù)據(jù)庫集群是一個(gè)騙人概念,一般只是備份,在集群數(shù)量和failover上有制約, 否則,數(shù)據(jù)庫巨頭Oracle不會跑到JavaEE陣營搖旗吶喊,還最早推出EJB3服務(wù)器,并揚(yáng)言要收購JavaEE過去老大 Bea Weblogic。
很顯然,數(shù)據(jù)庫成已經(jīng)為軟件系統(tǒng)的主要性能瓶頸了,單純依靠數(shù)據(jù)庫自救的方式已經(jīng)行不通,是宣布數(shù)據(jù)庫退出主角時(shí)候了,那么由誰來宣布:教皇數(shù)據(jù)庫已死?無疑是Java。
Java社區(qū)早在本世紀(jì)初就提出中間件概念,用以取代數(shù)據(jù)庫地位,實(shí)則就是將軟件系統(tǒng)主要負(fù)載從數(shù)據(jù)庫上轉(zhuǎn)移到中間件服務(wù)器上,分擔(dān)負(fù)載。 也就是說:Java社區(qū)提出:既然數(shù)據(jù)庫已經(jīng)成為瓶頸,修修補(bǔ)補(bǔ)也無濟(jì)于事,不如放棄它,不再依賴它。
也就是說:Java不再做SQL的運(yùn)輸工,不再是跑龍?zhí)椎牧耍侵鹘牵敲慈绾巫孞ava成為主角呢?那必須依賴對象這個(gè)概念,對象是生活在中間件服務(wù)器內(nèi)存中,它又是數(shù)據(jù)庫數(shù)據(jù)的業(yè)務(wù)封裝,它和數(shù)據(jù)庫有著 千絲萬縷的關(guān)系,但是它又和關(guān)系數(shù)據(jù)庫存在天然矛盾,兩者水火不容。
過去,我們是將業(yè)務(wù)邏輯寫成SQL送往數(shù)據(jù)庫執(zhí)行,導(dǎo)致數(shù)據(jù)庫成為業(yè)務(wù)邏輯主要運(yùn)行瓶頸,那么,如果我們將 業(yè)務(wù)邏輯用對象概念表達(dá),而不是SQL,那么我們的業(yè)務(wù)邏輯就圍繞內(nèi)存中的對象反復(fù)計(jì)算,這樣,負(fù)載不是集中在 對象運(yùn)行的中間件服務(wù)器上(也就是應(yīng)用服務(wù)器Weblogic/websphere/JBoss/Tomcat)?而對象/中間件都是用Java 語言表達(dá)的,無疑,這樣的架構(gòu),Java才成為主角。
再進(jìn)一步想想:如果我們從軟件系統(tǒng)開始之初,就使用對象分析設(shè)計(jì),不與數(shù)據(jù)庫沾邊,整個(gè)流程就完全OO,分析設(shè)計(jì)直至代碼都擺脫了數(shù)據(jù)庫影響,這個(gè)流程如下:
分析建模 細(xì)化設(shè)計(jì)(通過Evans DDD) 架構(gòu)設(shè)計(jì) 代碼實(shí)現(xiàn) 調(diào)試測試 部署運(yùn)行。
那么數(shù)據(jù)庫在什么時(shí)候建立呢?數(shù)據(jù)庫表結(jié)構(gòu)的創(chuàng)建可以延緩到部署運(yùn)行時(shí),由Hibernate/EJB CMP/JPA等ORM技術(shù)自動實(shí)現(xiàn)。這樣, 整個(gè)上游環(huán)節(jié)就不涉及數(shù)據(jù)庫技術(shù),而是使用更符合自然的表達(dá)OO方式,軟件質(zhì)量就更高了。我在J道網(wǎng)站已經(jīng)大量闡述了如何從OO分析 到OO實(shí)現(xiàn)的過程,包括我的Jdon框架也直接支持這樣一個(gè)自然方式。
現(xiàn)在,很多人已經(jīng)理解,分析設(shè)計(jì)要用OO,但是數(shù)據(jù)庫是運(yùn)行階段缺少不了的,確實(shí),這是正確觀點(diǎn),我們奪取數(shù)據(jù)庫的王位,不是將它打倒,只是理性和平移交權(quán)力重心而已,數(shù)據(jù)庫退出主角地位,讓位于Java中間件,也預(yù)示著過去數(shù)據(jù)庫為王的時(shí)代的結(jié)束, 但是數(shù)據(jù)庫會和操作系統(tǒng)一樣,成為我們現(xiàn)代軟件系統(tǒng)一個(gè)不可缺少重要的基礎(chǔ)環(huán)節(jié)。
正是基于這樣事實(shí),雖然我早在2005年喊出“數(shù)據(jù)庫時(shí)代的終結(jié)一文,回帖長達(dá)幾百貼, 大部分是懷疑論,不信論,其實(shí)2003年國外TSS就有一篇“給數(shù)據(jù)庫休息吧”(休息不代表退休,而是退居幕后,就象操作系統(tǒng)作用一樣),由此可見,由于傳統(tǒng)觀點(diǎn)影響和不及時(shí)與國際新思想同步,國內(nèi)數(shù)據(jù)庫保皇派還是有相當(dāng)人數(shù)的。我BanQ人微言輕,拋出這些觀點(diǎn)被保皇派譏諷為所瘋話,那么看看,著名ORM框架Hibernate和SEAM框架創(chuàng)始人Gavin King的一段觀點(diǎn):
In almost all enterprise applications, the database is the primary bottleneck, and the least scalable tier of the runtime environment. 數(shù)據(jù)庫成為了大多數(shù)企業(yè)應(yīng)用的主要瓶頸,也成為了運(yùn)行環(huán)境中最不具伸縮性的層。... PHP/Ruby的用戶會說什么都不共享(share nothing)的架構(gòu)照樣具有很好的伸縮性,.... 這些傻瓜真正想的是“除了數(shù)據(jù)庫以外什么都不共享(Share nothing except for the database)”的架構(gòu)。更多參看這里
所謂伸縮性,就是彈性,整個(gè)軟件架構(gòu)既支持小負(fù)載運(yùn)行,也支持大負(fù)載支持,只要增加服務(wù)器即可; 由于軟件系統(tǒng)負(fù)載已經(jīng)從SQL轉(zhuǎn)移到內(nèi)存中的對象上,那么我們就可以通過增加這些應(yīng)用服務(wù)器數(shù)量,通過分布式計(jì)算甚至云計(jì)算,達(dá)到業(yè)務(wù)對象在多臺應(yīng)用服務(wù)器之間傳遞共享,而不必通過數(shù)據(jù)庫這個(gè)環(huán)節(jié),既減輕數(shù)據(jù)庫負(fù)載,又能輕松擴(kuò)充性能,不必走 集中試大型主機(jī)之路,只要添置低廉PC服務(wù)器即可。經(jīng)過權(quán)威測試:websphere/weblogic的20臺PC服務(wù)器集群性能不亞于一臺SUN/IBM的中型機(jī),性價(jià)比已經(jīng)一目了然了。
JavaEE的服務(wù)器的集群相對于Linux等操作系統(tǒng)集群的好處在于:JavaEE集群能夠針對某個(gè)繁忙負(fù)載大的具體業(yè)務(wù)功能進(jìn)行集群,換句話說: 就是做到精確制導(dǎo),精確解決問題,而顯然,Linux操作系統(tǒng)的集群則無法直至業(yè)務(wù)核心的。
從另外一個(gè)方面看:雖然現(xiàn)在PHP號稱走上對象路線,Ruby的鐵軌開始鋪進(jìn)企業(yè),但是他們的運(yùn)行環(huán)境實(shí)則依賴數(shù)據(jù)庫的, 特別是Ruby On Rails還是最適合Evans DDD對象建模路線,但是目前來講還是"披著羊皮的狼",批著DDD,實(shí)則是以數(shù)據(jù)庫中心。當(dāng)然相信 ROR等將來會提供分布式計(jì)算環(huán)境,但是JavaEE在2002年時(shí)就通過EJB以及分布式緩存成熟穩(wěn)定地提供分布式計(jì)算的中間件,并且已經(jīng)大量成熟應(yīng)用。
本文結(jié)束以前,我相信大家明白,在眾多語言平臺競爭中,為什么Java能夠擊敗過去拳王數(shù)據(jù)庫,奪得新的拳王冠軍,以及他的特點(diǎn)所在。有人可能會說:你忘記談.NET了,這個(gè)不用我回答你,用微軟中國董事長張亞勤的話回答:8年前.NET戰(zhàn)略很天真, 你會將你的重要業(yè)務(wù)企業(yè)計(jì)算依賴一個(gè)很天真不成熟的技術(shù)嗎?除非你自己也很天真:)。
本博客為學(xué)習(xí)交流用,凡未注明引用的均為本人作品,轉(zhuǎn)載請注明出處,如有版權(quán)問題請及時(shí)通知。由于博客時(shí)間倉促,錯(cuò)誤之處敬請諒解,有任何意見可給我留言,愿共同學(xué)習(xí)進(jìn)步。