分布式(Distributed)數(shù)據(jù)訪問層(Data Access Layer)(以下簡稱DAL)是綜合MySQL Proxy、Memcached、集群等等技術(shù)優(yōu)點(diǎn)而構(gòu)建的一個(gè)軟件系統(tǒng)。目的是為了解決在構(gòu)建大中型網(wǎng)站時(shí)遇到的和數(shù)據(jù)訪問有關(guān)的諸多問題,如怎么使得切庫分表透明化,如何使得緩存存取清除自動(dòng)化,怎樣才能更好地防止服務(wù)單點(diǎn)故障等等。DAL是手機(jī)之家團(tuán)隊(duì)近幾年在開發(fā)和運(yùn)營上的經(jīng)驗(yàn)的總結(jié)以及智慧的結(jié)晶。
許超前 是手機(jī)之家一位資深的開發(fā)者和架構(gòu)師, JavaEye非常榮幸的采訪了他。
許超前博客:http://www.longker.org/
歡迎大家推薦更多開源項(xiàng)目和業(yè)界專家給我們,支持中國的IT發(fā)展,發(fā)站內(nèi)短信給JavaEye管理員或者發(fā)信到webmaster@javaeye.com,謝謝。
許超前 是手機(jī)之家一位資深的開發(fā)者和架構(gòu)師, JavaEye非常榮幸的采訪了他。
許超前博客:http://www.longker.org/
歡迎大家推薦更多開源項(xiàng)目和業(yè)界專家給我們,支持中國的IT發(fā)展,發(fā)站內(nèi)短信給JavaEye管理員或者發(fā)信到webmaster@javaeye.com,謝謝。
采訪分布式數(shù)據(jù)訪問層(Data Access Layer)作者許超前(十四) 
JavaEye:1.Hi,許超前,你好,非常榮幸能夠采訪你,首先你能夠向大家介紹一下分布式(Distributed)數(shù)據(jù)訪問層(Data Access Layer)嗎?
許超前:簡單說來,分布式數(shù)據(jù)訪問層(以下簡稱DAL)是綜合MySQL Proxy、Memcached、集群等等技術(shù)優(yōu)點(diǎn)而構(gòu)建的一個(gè)軟件系統(tǒng)。目的是為了解決在構(gòu)建大中型網(wǎng)站時(shí)遇到的和數(shù)據(jù)訪問有關(guān)的諸多問題,如怎么使得切庫分表透明化,如何使得緩存存取清除自動(dòng)化,怎樣才能更好地防止服務(wù)單點(diǎn)故障等等。后面,我會(huì)在我的博客上以及今年的SD2China大會(huì)上做進(jìn)一步的說明,有興趣的可以留意。
JavaEye:2.分布式(Distributed)數(shù)據(jù)訪問層(Data Access Layer)是什么時(shí)候誕生的,能否介紹一下發(fā)展歷程?
許超前:DAL的產(chǎn)生是經(jīng)歷一番波折的。
2007 年,手機(jī)之家的用戶已經(jīng)接近1000萬、PV也到了500萬以上,正處于中小型網(wǎng)站向大型網(wǎng)站的過渡時(shí)期。那時(shí)候,我們明顯感覺到我們?cè)诩夹g(shù)上已經(jīng)遇上了瓶頸:一個(gè)是系統(tǒng)負(fù)載過高,經(jīng)常要擔(dān)心我們的數(shù)據(jù)庫是不是又掛了,進(jìn)而造成整個(gè)系統(tǒng)的癱瘓;第二個(gè)是5年積累下來的代碼也已經(jīng)非常難以維護(hù),因?yàn)榉謱幽:Y(jié)果到處充滿著數(shù)據(jù)庫訪問邏輯、到處充滿著緩存讀寫邏輯,再加上表的設(shè)計(jì)不合理,造成無法簡單地進(jìn)行水平伸縮。總之,我們的系統(tǒng)已經(jīng)到了不得不進(jìn)行改造的地步了。
后來,老高(手機(jī)之家創(chuàng)始人高春輝)組了一個(gè)研發(fā)團(tuán)隊(duì),旨在從根本上解決上述提到的問題。在此后一年的時(shí)間里,我們走了很多彎路,經(jīng)歷了很多痛苦,不過,也正是在這段時(shí)間里,產(chǎn)生了DAL的雛形,經(jīng)過若干次改進(jìn),變成了后來的DAL1.0。DAL的產(chǎn)生完全是形勢使然。。。到了那個(gè)時(shí)間、在那個(gè)地點(diǎn)、做了那件事。
DAL1.0上線后數(shù)據(jù)庫的QPS明顯下降,從幾千降到幾百。事實(shí)證明,我們找到了一條行得通的路子。所以才有DAL的后續(xù)版本的開發(fā),才有今天的DAL2.x版本的產(chǎn)生。
JavaEye:3.能介紹一下手機(jī)之家網(wǎng)站和技術(shù)團(tuán)隊(duì)嗎?
許超前:手機(jī)之家是一個(gè)旨在提供全方位的手機(jī)相關(guān)服務(wù)的資訊類網(wǎng)站。在7年的時(shí)間里,手機(jī)之家從無到有,已經(jīng)發(fā)展成為極具人氣、最受關(guān)注的手機(jī)產(chǎn)品資訊網(wǎng)站。有點(diǎn)廣告的味道,不過說的都是事實(shí),呵呵。
以下是今年3月份在Beta技術(shù)沙龍上提到的統(tǒng)計(jì)數(shù)據(jù):
a. 1000w+用戶
b. 3000w+帖子
c. 1.1TB+附件
d. 780w+ Page View/每天
e. 5~10w在線用戶/15分
現(xiàn)在,用戶應(yīng)該是1200萬了吧,其它的也有所變動(dòng)。最近比較忙,沒再去關(guān)注。
手機(jī)之家現(xiàn)在有個(gè)技術(shù)部,負(fù)責(zé)網(wǎng)站的日常維護(hù)事宜;我們還有個(gè)項(xiàng)目組,負(fù)責(zé)整個(gè)系統(tǒng)的架構(gòu)設(shè)計(jì)及新技術(shù)的研究和探索等等。
JavaEye:4.分布式(Distributed)數(shù)據(jù)訪問層(Data Access Layer)的主要特點(diǎn)是什么?能否簡要分析一下它實(shí)現(xiàn)的主要技術(shù)核心?
許超前:要說特點(diǎn),摘抄一下我在博客里寫的關(guān)于新版DAL的項(xiàng)目目標(biāo),這些目標(biāo)在DAL2.x里已經(jīng)得到了相對(duì)較好的實(shí)現(xiàn),我想這應(yīng)該就是它最大的特點(diǎn)了吧:
一)可伸縮。
這里是指Scale Out.,即水平可伸縮。事實(shí)上,這點(diǎn)更應(yīng)該是整個(gè)系統(tǒng)要考慮的目標(biāo)了,而非DAL,DAL要考慮的是怎么更好地支持。舉例說,我們可以一個(gè)庫一個(gè)服務(wù),甚至可以是一個(gè)表一個(gè)服務(wù);庫、表拆分后,DAL應(yīng)能路由查詢、合并結(jié)果,而不是讓應(yīng)用程序去操心這些事。
二)高可用性。
1) 我們認(rèn)為出錯(cuò)失敗是很正常的,一臺(tái)機(jī)器倒下了,其它機(jī)器應(yīng)繼續(xù)保持系統(tǒng)正常運(yùn)作。容錯(cuò)是很重要的一個(gè)要求。
2) 系統(tǒng)規(guī)模大了以后,很容易出現(xiàn)“異構(gòu)“的情況,如原有模塊MySQL表引擎是MyISAM的,是不支持事務(wù)的,而新上的模塊又采用了InnoDB表引擎,在這種情況下,DAL應(yīng)能對(duì)原有模塊進(jìn)行優(yōu)雅降級(jí)。
3)失敗恢復(fù)也是要考慮的,失敗后,需要把失敗前駐留在內(nèi)存中的消息找回來。
4) 另外,DAL本身也在快速的迭代當(dāng)中,升級(jí)是很經(jīng)常的事,應(yīng)能進(jìn)行在線熱升級(jí)(不重啟原有服務(wù))。
三)良好的性能。
對(duì)于根據(jù)Id來取記錄的查詢,在緩存命中的情況下,應(yīng)該達(dá)到和Memcached不相上下的讀取速度。在緩存不命中的情況下,則應(yīng)該充分利用分庫分表和并行計(jì)算的優(yōu)勢,最大化地提高查詢的效率。對(duì)于修改型查詢,掛在上面的監(jiān)聽器,不應(yīng)該影響性能。
四)系統(tǒng)可監(jiān)控。
資源占用情況,命中率如何,系統(tǒng)當(dāng)前壓力怎樣等等,都應(yīng)該是可知的。應(yīng)該有報(bào)警機(jī)制,當(dāng)壓力到達(dá)一個(gè)閥值以后,通知相關(guān)人員進(jìn)行處理。還應(yīng)該有詳細(xì)的錯(cuò)誤日志,便于排查問題。
五)安全。
沒有SQL注入問題;避免或盡量減少分表和索引表之間的數(shù)據(jù)不一致問題等等。
六)易于編程。
需要設(shè)計(jì)一套簡單好用的API,便于應(yīng)用程序的開發(fā)。API必須是自完備的,應(yīng)用開發(fā)者不需要太費(fèi)力就能記住的。
應(yīng)用開發(fā)人員不再關(guān)心分庫分表問題,不再關(guān)心緩存問題, 特別是緩存清除問題。甚至不再關(guān)心后端的數(shù)據(jù)庫是MySQL,還是Oracle,或者是其它。
七)可定制、可擴(kuò)展、可維護(hù)的架構(gòu)設(shè)計(jì)。
像連接池組件、緩存組件、查詢分析組件、消息隊(duì)列組件、通訊協(xié)議等等不應(yīng)該寫死,應(yīng)設(shè)計(jì)成可方便定制的。還應(yīng)該提供足夠的鉤子用于擴(kuò)展。只有這樣,DAL 的架構(gòu)才是靈活的、擁抱變化的。簡單說,我們定的是機(jī)制,提供的是策略;機(jī)制是軟件目標(biāo)和宗旨的體現(xiàn),一般是不能輕易改變的,而策略則應(yīng)當(dāng)是能比較簡單地進(jìn)行切換的。
這里面,每一點(diǎn)都可以說說,還是在以后的博客里,再來詳細(xì)和大家討論吧。
JavaEye:5.分布式(Distributed)數(shù)據(jù)訪問層(Data Access Layer)應(yīng)用的主要場景是什么?能否詳細(xì)比較一下分布式(Distributed)數(shù)據(jù)訪問層(Data Access Layer)和類似產(chǎn)品比如hibernate的區(qū)別嗎?
許超前:DAL比較適用于大中型網(wǎng)站,對(duì)于想提高系統(tǒng)負(fù)載能力及響應(yīng)速度的小型網(wǎng)站也是適用的,但可能獲得的好處不如大中型網(wǎng)站那么明顯。
DAL和Hibernate兩者不具有可比性,從出發(fā)點(diǎn)來看就不同,DAL一開始是為了提高網(wǎng)站的負(fù)載能力,而Hibernate則是為了能更快地開發(fā)Java應(yīng)用。手機(jī)之家采用混合編程,上層應(yīng)用不一定是用Java寫的,要讓(非Java)程序員對(duì)每個(gè)模塊涉及到的表結(jié)構(gòu)都用Java實(shí)體類寫一遍,不太現(xiàn)實(shí)。相反,我們采取了不同的思考方式,我們的程序員面向的是表和記錄,而不是實(shí)體類和實(shí)體對(duì)象。雖然,DAL也有Mapping的概念,但是它的Mapping是指邏輯表到物理表的Mapping,而不是Java對(duì)象到數(shù)據(jù)庫模式的Mapping。DAL的邏輯表可能對(duì)應(yīng)著多個(gè)物理表,程序員看到的是邏輯表,不用關(guān)心后面有多少個(gè)物理表。
MySQL Proxy也提供了一些類似的特性,DAL與它的第一個(gè)不同在于,我們的緩存處理是內(nèi)置的,我們從設(shè)計(jì)之初就特別認(rèn)真地考慮緩存這塊,而MySQL Proxy得自己寫Lua腳本。第二個(gè)不同在于,我們針對(duì)的不僅僅是MySQL這一種數(shù)據(jù)庫。而且,我們還有很多其它的事情要做。
另外,國內(nèi)還有一個(gè)開源項(xiàng)目叫Amoeba。Amoeba關(guān)注的領(lǐng)域是切分,在這個(gè)領(lǐng)域,Amoeba對(duì)概念的抽象還是不錯(cuò)的。DAL更像是一個(gè)完整的系統(tǒng),當(dāng)然,也可以只用DAL來做切分,其它的邏輯自己編寫,想擁有哪些特性都是可配置的。這樣設(shè)計(jì)一個(gè)是為了易用,一拿來就能用,另一個(gè)是為了能更好的和現(xiàn)有的解決方案(如Hibernate)集成,雖然DAL在很多方面都可以取代它們(如Hibernate)。
最后,我相信,肯定還存在很多類似的解決方案,只是我們不曾得知。或許是過于定制化了,或許是還不夠成熟。。。
JavaEye:6.目前大概有多少用戶在使用分布式(Distributed)數(shù)據(jù)訪問層(Data Access Layer)?
許超前:目前DAL主要用在手機(jī)之家網(wǎng)站上面,當(dāng)然,還有其它的項(xiàng)目也在用。
JavaEye:7.目前分布式(Distributed)數(shù)據(jù)訪問層(Data Access Layer) 開發(fā)的技術(shù)難點(diǎn)是哪里?
許超前:要說技術(shù)難點(diǎn),我覺得有以下幾點(diǎn):
一)如何降低CPU負(fù)載及減少內(nèi)存占用。
二)如何提高查詢條件的分析速度。
三)如何更有效地路由到相應(yīng)的庫和表上。
四)如何提高緩存的命中率。
五)如何更有效的進(jìn)行數(shù)據(jù)復(fù)制。
JavaEye:8.你每周大概花多少時(shí)間在分布式(Distributed)數(shù)據(jù)訪問層(Data Access Layer)項(xiàng)目上面?
許超前:每周大概80個(gè)小時(shí)左右。
JavaEye:9.開發(fā)分布式(Distributed)數(shù)據(jù)訪問層(Data Access Layer)帶給你最大的收獲是什么?
許超前:一)貴在堅(jiān)持。一個(gè)長開發(fā)周期的軟件,到了后面,不僅是對(duì)開發(fā)人員體力、智力的綜合考驗(yàn),更是對(duì)開發(fā)人員心理承受能力的考驗(yàn),因?yàn)檫@時(shí)會(huì)有來自各方的及自發(fā)的壓力。如果能堅(jiān)持下去,扛過這一關(guān),事情往往就成了一半。
二)找一些和你有共同目標(biāo)的人一塊共事。否則會(huì)耗費(fèi)大量的溝通成本。
三)用數(shù)據(jù)說話。事務(wù)都在變化當(dāng)中,幾年前的經(jīng)驗(yàn),也許到今天就不靈了。而且很多事情并不是像我們想象得那樣去發(fā)展。
四)中國不打折。
JavaEye:10.開發(fā)分布式(Distributed)數(shù)據(jù)訪問層(Data Access Layer)的roadmap是什么?近期遠(yuǎn)期的開發(fā)計(jì)劃計(jì)劃是什么?
許超前:接下來的版本要做的事有這幾個(gè)方面:
一)更多的協(xié)議開發(fā),這樣才能作為透明代理使用,比如我們的PMA也可以使用了。
二)數(shù)據(jù)庫廠商中立的數(shù)據(jù)復(fù)制。
三)嵌入式API,考慮和Spring、Guice等集成,方便Java應(yīng)用開發(fā)人員的使用。
JavaEye:11.你的開發(fā)環(huán)境是什么? 使用什么操作系統(tǒng),和IDE?
許超前:一直用Linux操作系統(tǒng),現(xiàn)在是Ubuntu,IDE用Eclipse。
JavaEye:12.開發(fā)分布式(Distributed)數(shù)據(jù)訪問層(Data Access Layer)項(xiàng)目是如何推廣的?未來有什么推廣方面的計(jì)劃嗎?
許超前:DAL目前只在內(nèi)部項(xiàng)目中使用。等足夠成熟了,我們會(huì)采取一系列辦法進(jìn)行推廣的。
JavaEye:13.通過開發(fā)開發(fā)分布式(Distributed)數(shù)據(jù)訪問層(Data Access Layer)項(xiàng)目 ,你對(duì)中國的開源軟件現(xiàn)狀有什么看法?對(duì)國內(nèi)軟件開發(fā)人員做開源項(xiàng)目有什么感受和想法嗎?
許超前:我們的IT行業(yè)起步晚,開源文化還不夠深入人心,再加上我們中的大部份人還在為生計(jì)發(fā)愁,所以對(duì)開源事業(yè)上心的人還是少數(shù)。因此,和歐美發(fā)達(dá)國家比起來,我們的開源事業(yè)相對(duì)滯后。
我由衷地敬佩那些做開源項(xiàng)目的開發(fā)人員,如果可能,我也希望多做些開源軟件和大家一塊分享。
JavaEye:14.作為一個(gè)JavaEye的會(huì)員,你對(duì)JavaEye網(wǎng)站有什么建議和意見嗎?
許超前:想辦法讓老人多發(fā)言,同時(shí)也給新人提供一個(gè)學(xué)習(xí)成長的地方。比如可以弄個(gè)師徒頻道(有點(diǎn)SNS的味道),老人可以招學(xué)徒,新人可以拜師傅。
許超前:簡單說來,分布式數(shù)據(jù)訪問層(以下簡稱DAL)是綜合MySQL Proxy、Memcached、集群等等技術(shù)優(yōu)點(diǎn)而構(gòu)建的一個(gè)軟件系統(tǒng)。目的是為了解決在構(gòu)建大中型網(wǎng)站時(shí)遇到的和數(shù)據(jù)訪問有關(guān)的諸多問題,如怎么使得切庫分表透明化,如何使得緩存存取清除自動(dòng)化,怎樣才能更好地防止服務(wù)單點(diǎn)故障等等。后面,我會(huì)在我的博客上以及今年的SD2China大會(huì)上做進(jìn)一步的說明,有興趣的可以留意。
JavaEye:2.分布式(Distributed)數(shù)據(jù)訪問層(Data Access Layer)是什么時(shí)候誕生的,能否介紹一下發(fā)展歷程?
許超前:DAL的產(chǎn)生是經(jīng)歷一番波折的。
2007 年,手機(jī)之家的用戶已經(jīng)接近1000萬、PV也到了500萬以上,正處于中小型網(wǎng)站向大型網(wǎng)站的過渡時(shí)期。那時(shí)候,我們明顯感覺到我們?cè)诩夹g(shù)上已經(jīng)遇上了瓶頸:一個(gè)是系統(tǒng)負(fù)載過高,經(jīng)常要擔(dān)心我們的數(shù)據(jù)庫是不是又掛了,進(jìn)而造成整個(gè)系統(tǒng)的癱瘓;第二個(gè)是5年積累下來的代碼也已經(jīng)非常難以維護(hù),因?yàn)榉謱幽:Y(jié)果到處充滿著數(shù)據(jù)庫訪問邏輯、到處充滿著緩存讀寫邏輯,再加上表的設(shè)計(jì)不合理,造成無法簡單地進(jìn)行水平伸縮。總之,我們的系統(tǒng)已經(jīng)到了不得不進(jìn)行改造的地步了。
后來,老高(手機(jī)之家創(chuàng)始人高春輝)組了一個(gè)研發(fā)團(tuán)隊(duì),旨在從根本上解決上述提到的問題。在此后一年的時(shí)間里,我們走了很多彎路,經(jīng)歷了很多痛苦,不過,也正是在這段時(shí)間里,產(chǎn)生了DAL的雛形,經(jīng)過若干次改進(jìn),變成了后來的DAL1.0。DAL的產(chǎn)生完全是形勢使然。。。到了那個(gè)時(shí)間、在那個(gè)地點(diǎn)、做了那件事。
DAL1.0上線后數(shù)據(jù)庫的QPS明顯下降,從幾千降到幾百。事實(shí)證明,我們找到了一條行得通的路子。所以才有DAL的后續(xù)版本的開發(fā),才有今天的DAL2.x版本的產(chǎn)生。
JavaEye:3.能介紹一下手機(jī)之家網(wǎng)站和技術(shù)團(tuán)隊(duì)嗎?
許超前:手機(jī)之家是一個(gè)旨在提供全方位的手機(jī)相關(guān)服務(wù)的資訊類網(wǎng)站。在7年的時(shí)間里,手機(jī)之家從無到有,已經(jīng)發(fā)展成為極具人氣、最受關(guān)注的手機(jī)產(chǎn)品資訊網(wǎng)站。有點(diǎn)廣告的味道,不過說的都是事實(shí),呵呵。
以下是今年3月份在Beta技術(shù)沙龍上提到的統(tǒng)計(jì)數(shù)據(jù):
a. 1000w+用戶
b. 3000w+帖子
c. 1.1TB+附件
d. 780w+ Page View/每天
e. 5~10w在線用戶/15分
現(xiàn)在,用戶應(yīng)該是1200萬了吧,其它的也有所變動(dòng)。最近比較忙,沒再去關(guān)注。
手機(jī)之家現(xiàn)在有個(gè)技術(shù)部,負(fù)責(zé)網(wǎng)站的日常維護(hù)事宜;我們還有個(gè)項(xiàng)目組,負(fù)責(zé)整個(gè)系統(tǒng)的架構(gòu)設(shè)計(jì)及新技術(shù)的研究和探索等等。
JavaEye:4.分布式(Distributed)數(shù)據(jù)訪問層(Data Access Layer)的主要特點(diǎn)是什么?能否簡要分析一下它實(shí)現(xiàn)的主要技術(shù)核心?
許超前:要說特點(diǎn),摘抄一下我在博客里寫的關(guān)于新版DAL的項(xiàng)目目標(biāo),這些目標(biāo)在DAL2.x里已經(jīng)得到了相對(duì)較好的實(shí)現(xiàn),我想這應(yīng)該就是它最大的特點(diǎn)了吧:
一)可伸縮。
這里是指Scale Out.,即水平可伸縮。事實(shí)上,這點(diǎn)更應(yīng)該是整個(gè)系統(tǒng)要考慮的目標(biāo)了,而非DAL,DAL要考慮的是怎么更好地支持。舉例說,我們可以一個(gè)庫一個(gè)服務(wù),甚至可以是一個(gè)表一個(gè)服務(wù);庫、表拆分后,DAL應(yīng)能路由查詢、合并結(jié)果,而不是讓應(yīng)用程序去操心這些事。
二)高可用性。
1) 我們認(rèn)為出錯(cuò)失敗是很正常的,一臺(tái)機(jī)器倒下了,其它機(jī)器應(yīng)繼續(xù)保持系統(tǒng)正常運(yùn)作。容錯(cuò)是很重要的一個(gè)要求。
2) 系統(tǒng)規(guī)模大了以后,很容易出現(xiàn)“異構(gòu)“的情況,如原有模塊MySQL表引擎是MyISAM的,是不支持事務(wù)的,而新上的模塊又采用了InnoDB表引擎,在這種情況下,DAL應(yīng)能對(duì)原有模塊進(jìn)行優(yōu)雅降級(jí)。
3)失敗恢復(fù)也是要考慮的,失敗后,需要把失敗前駐留在內(nèi)存中的消息找回來。
4) 另外,DAL本身也在快速的迭代當(dāng)中,升級(jí)是很經(jīng)常的事,應(yīng)能進(jìn)行在線熱升級(jí)(不重啟原有服務(wù))。
三)良好的性能。
對(duì)于根據(jù)Id來取記錄的查詢,在緩存命中的情況下,應(yīng)該達(dá)到和Memcached不相上下的讀取速度。在緩存不命中的情況下,則應(yīng)該充分利用分庫分表和并行計(jì)算的優(yōu)勢,最大化地提高查詢的效率。對(duì)于修改型查詢,掛在上面的監(jiān)聽器,不應(yīng)該影響性能。
四)系統(tǒng)可監(jiān)控。
資源占用情況,命中率如何,系統(tǒng)當(dāng)前壓力怎樣等等,都應(yīng)該是可知的。應(yīng)該有報(bào)警機(jī)制,當(dāng)壓力到達(dá)一個(gè)閥值以后,通知相關(guān)人員進(jìn)行處理。還應(yīng)該有詳細(xì)的錯(cuò)誤日志,便于排查問題。
五)安全。
沒有SQL注入問題;避免或盡量減少分表和索引表之間的數(shù)據(jù)不一致問題等等。
六)易于編程。
需要設(shè)計(jì)一套簡單好用的API,便于應(yīng)用程序的開發(fā)。API必須是自完備的,應(yīng)用開發(fā)者不需要太費(fèi)力就能記住的。
應(yīng)用開發(fā)人員不再關(guān)心分庫分表問題,不再關(guān)心緩存問題, 特別是緩存清除問題。甚至不再關(guān)心后端的數(shù)據(jù)庫是MySQL,還是Oracle,或者是其它。
七)可定制、可擴(kuò)展、可維護(hù)的架構(gòu)設(shè)計(jì)。
像連接池組件、緩存組件、查詢分析組件、消息隊(duì)列組件、通訊協(xié)議等等不應(yīng)該寫死,應(yīng)設(shè)計(jì)成可方便定制的。還應(yīng)該提供足夠的鉤子用于擴(kuò)展。只有這樣,DAL 的架構(gòu)才是靈活的、擁抱變化的。簡單說,我們定的是機(jī)制,提供的是策略;機(jī)制是軟件目標(biāo)和宗旨的體現(xiàn),一般是不能輕易改變的,而策略則應(yīng)當(dāng)是能比較簡單地進(jìn)行切換的。
這里面,每一點(diǎn)都可以說說,還是在以后的博客里,再來詳細(xì)和大家討論吧。
JavaEye:5.分布式(Distributed)數(shù)據(jù)訪問層(Data Access Layer)應(yīng)用的主要場景是什么?能否詳細(xì)比較一下分布式(Distributed)數(shù)據(jù)訪問層(Data Access Layer)和類似產(chǎn)品比如hibernate的區(qū)別嗎?
許超前:DAL比較適用于大中型網(wǎng)站,對(duì)于想提高系統(tǒng)負(fù)載能力及響應(yīng)速度的小型網(wǎng)站也是適用的,但可能獲得的好處不如大中型網(wǎng)站那么明顯。
DAL和Hibernate兩者不具有可比性,從出發(fā)點(diǎn)來看就不同,DAL一開始是為了提高網(wǎng)站的負(fù)載能力,而Hibernate則是為了能更快地開發(fā)Java應(yīng)用。手機(jī)之家采用混合編程,上層應(yīng)用不一定是用Java寫的,要讓(非Java)程序員對(duì)每個(gè)模塊涉及到的表結(jié)構(gòu)都用Java實(shí)體類寫一遍,不太現(xiàn)實(shí)。相反,我們采取了不同的思考方式,我們的程序員面向的是表和記錄,而不是實(shí)體類和實(shí)體對(duì)象。雖然,DAL也有Mapping的概念,但是它的Mapping是指邏輯表到物理表的Mapping,而不是Java對(duì)象到數(shù)據(jù)庫模式的Mapping。DAL的邏輯表可能對(duì)應(yīng)著多個(gè)物理表,程序員看到的是邏輯表,不用關(guān)心后面有多少個(gè)物理表。
MySQL Proxy也提供了一些類似的特性,DAL與它的第一個(gè)不同在于,我們的緩存處理是內(nèi)置的,我們從設(shè)計(jì)之初就特別認(rèn)真地考慮緩存這塊,而MySQL Proxy得自己寫Lua腳本。第二個(gè)不同在于,我們針對(duì)的不僅僅是MySQL這一種數(shù)據(jù)庫。而且,我們還有很多其它的事情要做。
另外,國內(nèi)還有一個(gè)開源項(xiàng)目叫Amoeba。Amoeba關(guān)注的領(lǐng)域是切分,在這個(gè)領(lǐng)域,Amoeba對(duì)概念的抽象還是不錯(cuò)的。DAL更像是一個(gè)完整的系統(tǒng),當(dāng)然,也可以只用DAL來做切分,其它的邏輯自己編寫,想擁有哪些特性都是可配置的。這樣設(shè)計(jì)一個(gè)是為了易用,一拿來就能用,另一個(gè)是為了能更好的和現(xiàn)有的解決方案(如Hibernate)集成,雖然DAL在很多方面都可以取代它們(如Hibernate)。
最后,我相信,肯定還存在很多類似的解決方案,只是我們不曾得知。或許是過于定制化了,或許是還不夠成熟。。。
JavaEye:6.目前大概有多少用戶在使用分布式(Distributed)數(shù)據(jù)訪問層(Data Access Layer)?
許超前:目前DAL主要用在手機(jī)之家網(wǎng)站上面,當(dāng)然,還有其它的項(xiàng)目也在用。
JavaEye:7.目前分布式(Distributed)數(shù)據(jù)訪問層(Data Access Layer) 開發(fā)的技術(shù)難點(diǎn)是哪里?
許超前:要說技術(shù)難點(diǎn),我覺得有以下幾點(diǎn):
一)如何降低CPU負(fù)載及減少內(nèi)存占用。
二)如何提高查詢條件的分析速度。
三)如何更有效地路由到相應(yīng)的庫和表上。
四)如何提高緩存的命中率。
五)如何更有效的進(jìn)行數(shù)據(jù)復(fù)制。
JavaEye:8.你每周大概花多少時(shí)間在分布式(Distributed)數(shù)據(jù)訪問層(Data Access Layer)項(xiàng)目上面?
許超前:每周大概80個(gè)小時(shí)左右。
JavaEye:9.開發(fā)分布式(Distributed)數(shù)據(jù)訪問層(Data Access Layer)帶給你最大的收獲是什么?
許超前:一)貴在堅(jiān)持。一個(gè)長開發(fā)周期的軟件,到了后面,不僅是對(duì)開發(fā)人員體力、智力的綜合考驗(yàn),更是對(duì)開發(fā)人員心理承受能力的考驗(yàn),因?yàn)檫@時(shí)會(huì)有來自各方的及自發(fā)的壓力。如果能堅(jiān)持下去,扛過這一關(guān),事情往往就成了一半。
二)找一些和你有共同目標(biāo)的人一塊共事。否則會(huì)耗費(fèi)大量的溝通成本。
三)用數(shù)據(jù)說話。事務(wù)都在變化當(dāng)中,幾年前的經(jīng)驗(yàn),也許到今天就不靈了。而且很多事情并不是像我們想象得那樣去發(fā)展。
四)中國不打折。
JavaEye:10.開發(fā)分布式(Distributed)數(shù)據(jù)訪問層(Data Access Layer)的roadmap是什么?近期遠(yuǎn)期的開發(fā)計(jì)劃計(jì)劃是什么?
許超前:接下來的版本要做的事有這幾個(gè)方面:
一)更多的協(xié)議開發(fā),這樣才能作為透明代理使用,比如我們的PMA也可以使用了。
二)數(shù)據(jù)庫廠商中立的數(shù)據(jù)復(fù)制。
三)嵌入式API,考慮和Spring、Guice等集成,方便Java應(yīng)用開發(fā)人員的使用。
JavaEye:11.你的開發(fā)環(huán)境是什么? 使用什么操作系統(tǒng),和IDE?
許超前:一直用Linux操作系統(tǒng),現(xiàn)在是Ubuntu,IDE用Eclipse。
JavaEye:12.開發(fā)分布式(Distributed)數(shù)據(jù)訪問層(Data Access Layer)項(xiàng)目是如何推廣的?未來有什么推廣方面的計(jì)劃嗎?
許超前:DAL目前只在內(nèi)部項(xiàng)目中使用。等足夠成熟了,我們會(huì)采取一系列辦法進(jìn)行推廣的。
JavaEye:13.通過開發(fā)開發(fā)分布式(Distributed)數(shù)據(jù)訪問層(Data Access Layer)項(xiàng)目 ,你對(duì)中國的開源軟件現(xiàn)狀有什么看法?對(duì)國內(nèi)軟件開發(fā)人員做開源項(xiàng)目有什么感受和想法嗎?
許超前:我們的IT行業(yè)起步晚,開源文化還不夠深入人心,再加上我們中的大部份人還在為生計(jì)發(fā)愁,所以對(duì)開源事業(yè)上心的人還是少數(shù)。因此,和歐美發(fā)達(dá)國家比起來,我們的開源事業(yè)相對(duì)滯后。
我由衷地敬佩那些做開源項(xiàng)目的開發(fā)人員,如果可能,我也希望多做些開源軟件和大家一塊分享。
JavaEye:14.作為一個(gè)JavaEye的會(huì)員,你對(duì)JavaEye網(wǎng)站有什么建議和意見嗎?
許超前:想辦法讓老人多發(fā)言,同時(shí)也給新人提供一個(gè)學(xué)習(xí)成長的地方。比如可以弄個(gè)師徒頻道(有點(diǎn)SNS的味道),老人可以招學(xué)徒,新人可以拜師傅。
安徽新華電腦學(xué)校專業(yè)職業(yè)規(guī)劃師為你提供更多幫助【在線咨詢】