聊聊存儲(chǔ)過程的使用,你學(xué)會(huì)了嗎?
受到互聯(lián)網(wǎng)企業(yè)的影響,這些年在企業(yè)級(jí)應(yīng)用開發(fā)中,存儲(chǔ)過程的使用受到了一定的限制,甚至有些企業(yè)明確在IT技術(shù)應(yīng)用規(guī)范中禁用存儲(chǔ)過程。實(shí)際上在二十多年前,使用存儲(chǔ)過程是Oracle數(shù)據(jù)庫(kù)優(yōu)化中的一個(gè)十分重要的技術(shù)手段,對(duì)于處理批量業(yè)務(wù)處理十分有幫助。因?yàn)楫?dāng)時(shí)的數(shù)據(jù)庫(kù)CPU、內(nèi)存、IO資源都相對(duì)緊張,網(wǎng)絡(luò)的帶寬和延時(shí)也存在諸多瓶頸。使用存儲(chǔ)過程可以將一些工作封裝在一個(gè)數(shù)據(jù)庫(kù)的內(nèi)部執(zhí)行單元中,減少前臺(tái)進(jìn)程與RDBMS內(nèi)核的交互,從而獲得更高的效率?;诖?,目前還有不少銀行還在大量使用存儲(chǔ)過程。
二十年前,華為的一個(gè)項(xiàng)目組為了實(shí)現(xiàn)應(yīng)用與數(shù)據(jù)庫(kù)無(wú)關(guān),對(duì)應(yīng)用進(jìn)行改造的時(shí)候去掉了所有的存儲(chǔ)過程,上線后發(fā)現(xiàn)改造后的應(yīng)用性能下降十分嚴(yán)重。我?guī)椭治龊蟀l(fā)現(xiàn)因?yàn)閿?shù)據(jù)庫(kù)與應(yīng)用模塊跨數(shù)據(jù)中心部署,因此SQL在網(wǎng)絡(luò)上的交互延時(shí)嚴(yán)重影響了性能。因此在當(dāng)時(shí)的條件下,他們很難放棄存儲(chǔ)過程,為此他們最終放棄了多數(shù)據(jù)庫(kù)支持而選擇了回歸存儲(chǔ)過程。
這些年隨著互聯(lián)網(wǎng)企業(yè)在IT上的成功,很多企業(yè)也在學(xué)習(xí)互聯(lián)網(wǎng)架構(gòu)。大量的應(yīng)用不再使用存儲(chǔ)過程,應(yīng)用的業(yè)務(wù)邏輯更多地被從數(shù)據(jù)庫(kù)中抽取出來,放到應(yīng)用系統(tǒng)中。應(yīng)用對(duì)數(shù)據(jù)庫(kù)的依賴就降低了,應(yīng)用在不同品種的數(shù)據(jù)庫(kù)之中的遷移也變得簡(jiǎn)單了。同時(shí)因?yàn)闃I(yè)務(wù)邏輯更多地遷移到應(yīng)用服務(wù)器上,數(shù)據(jù)庫(kù)服務(wù)器的資源消耗也下降了,數(shù)據(jù)庫(kù)服務(wù)器的瓶頸也得到了緩解。于是這些年應(yīng)用去存儲(chǔ)過程在很多企業(yè)里熱門起來,存儲(chǔ)過程的使用也大幅下降了。
不過也有一些企業(yè)發(fā)現(xiàn),去掉存儲(chǔ)過程,將業(yè)務(wù)邏輯放到應(yīng)用中去之后,應(yīng)用的質(zhì)量管控變得更加困難了。以前在一個(gè)研發(fā)隊(duì)伍中開發(fā)存儲(chǔ)過程的都是對(duì)業(yè)務(wù)邏輯理解十分深刻,數(shù)據(jù)庫(kù)功底比較好的老鳥,這些人寫出的存儲(chǔ)過程雖然復(fù)雜,不過質(zhì)量還是杠杠的。哪怕存在一些問題,優(yōu)化起來只要集中精力去優(yōu)化PL/SQL的代碼就可以了。而現(xiàn)在業(yè)務(wù)邏輯分散到應(yīng)用中,由水平差異較大的開發(fā)人員去開發(fā),應(yīng)用的質(zhì)量變得更難控制了,優(yōu)化的難度也變大了。
實(shí)際上絕大多數(shù)傳統(tǒng)行業(yè)企業(yè)是缺乏互聯(lián)網(wǎng)基因的,互聯(lián)網(wǎng)企業(yè)與傳統(tǒng)企業(yè)最大的區(qū)別是在IT上的投入的區(qū)別。互聯(lián)網(wǎng)企業(yè)能把所有邏輯放到應(yīng)用上,并不是互聯(lián)網(wǎng)企業(yè)的架構(gòu)有多優(yōu)秀,而是互聯(lián)網(wǎng)企業(yè)能夠在IT上投入巨資,由大量?jī)?yōu)秀的開發(fā)人員來完成這項(xiàng)工作。而傳統(tǒng)行業(yè)企業(yè)的IT投入與互聯(lián)網(wǎng)企業(yè)無(wú)法相比,IT員工工資收入要低得多,IT部門人員的素質(zhì)肯定也要遠(yuǎn)遠(yuǎn)低于互聯(lián)網(wǎng)企業(yè)。在這種情況下,研發(fā)團(tuán)隊(duì)往往是很難駕馭好互聯(lián)網(wǎng)架構(gòu)的應(yīng)用的。
企業(yè)級(jí)關(guān)系型數(shù)據(jù)庫(kù)都有存儲(chǔ)過程這個(gè)功能,這個(gè)功能就是為了簡(jiǎn)化應(yīng)用開發(fā)難度,提高應(yīng)用效率的。在應(yīng)用中使用存儲(chǔ)過程是可以降低應(yīng)用軟件開發(fā)與維護(hù)成本,提高系統(tǒng)中批量處理業(yè)務(wù)的性能的。近來企業(yè)應(yīng)用中使用較少除了受到互聯(lián)網(wǎng)企業(yè)的引導(dǎo)之外,還有一個(gè)因素是減少對(duì)某個(gè)數(shù)據(jù)庫(kù)的依賴。其實(shí)在前些年去IOE的過程中,很多企業(yè)已經(jīng)感受到了數(shù)據(jù)庫(kù)遷移帶來的痛苦,以及被Oracle數(shù)據(jù)庫(kù)綁定后不斷上升的數(shù)據(jù)庫(kù)使用成本的困擾。
當(dāng)年很多企業(yè)決定借鑒互聯(lián)網(wǎng)架構(gòu)的另外一個(gè)原因是因?yàn)楹芏鄳?yīng)用開發(fā)以數(shù)據(jù)庫(kù)為核心,而數(shù)據(jù)庫(kù)在橫向擴(kuò)展方面的能力不足,因此數(shù)據(jù)庫(kù)往往會(huì)成為應(yīng)用系統(tǒng)中最大的瓶頸。與其擴(kuò)容昂貴的小型機(jī),還不如將部分應(yīng)用負(fù)載轉(zhuǎn)移到相對(duì)便宜、比較容易橫向擴(kuò)展的應(yīng)用服務(wù)器上。
有些企業(yè)在應(yīng)用架構(gòu)轉(zhuǎn)型中獲得了成功,不過很多企業(yè)轉(zhuǎn)型后雖然解決了數(shù)據(jù)庫(kù)服務(wù)器瓶頸的問題,但是遇到了新的挑戰(zhàn)-應(yīng)用開發(fā)的成本太高了。與傳統(tǒng)的IOE架構(gòu)相比,現(xiàn)在的應(yīng)用架構(gòu)中引入了太多復(fù)雜的組件,應(yīng)用開發(fā)成本增大,開發(fā)周期變長(zhǎng),運(yùn)維難度也大幅上升。有些企業(yè)甚至已經(jīng)在反思是不是每個(gè)系統(tǒng)都需要采用如此復(fù)雜的架構(gòu)。
在數(shù)據(jù)庫(kù)國(guó)產(chǎn)化替代的今天,我看到了一個(gè)十分有趣的現(xiàn)象,那就是國(guó)產(chǎn)數(shù)據(jù)庫(kù)大多數(shù)都提供了比較好的Oracle PL/SQL的兼容支持。而且大多數(shù)國(guó)產(chǎn)數(shù)據(jù)庫(kù)支持的PL/SQL語(yǔ)法肯定都不全面,不過因?yàn)镻L/SQL中較為容易實(shí)現(xiàn)的部分都被國(guó)產(chǎn)數(shù)據(jù)庫(kù)所支持了,所以目前國(guó)產(chǎn)數(shù)據(jù)庫(kù)的PL/SQL語(yǔ)法反而是比較接近的。在國(guó)產(chǎn)數(shù)據(jù)庫(kù)之間遷移PL/SQL存儲(chǔ)過程的難度很低。使用國(guó)產(chǎn)數(shù)據(jù)庫(kù)后,如果想要換另外一個(gè)國(guó)產(chǎn)數(shù)據(jù)庫(kù),基本上可以平替。
前幾天和一個(gè)國(guó)產(chǎn)數(shù)據(jù)庫(kù)廠商談到這方面的問題的時(shí)候,突然想到,國(guó)產(chǎn)數(shù)據(jù)庫(kù)時(shí)代,是不是可以回歸大量使用存儲(chǔ)過程,從而降低應(yīng)用研發(fā)與應(yīng)用維護(hù)的成本呢?似乎這是可行的,當(dāng)年JAVA剛剛流行,替代C的時(shí)候就是如此。因?yàn)榇鎯?chǔ)過程這個(gè)大殺器的存在,讓企業(yè)使用熟悉業(yè)務(wù)邏輯與數(shù)據(jù)庫(kù)架構(gòu)的高手將核心業(yè)務(wù)邏輯封裝在存儲(chǔ)過程中,再安排大量技術(shù)水平一般的JAVA程序員去解決前端應(yīng)用易用性的問題,從而讓信息系統(tǒng)開發(fā)的門檻一下子降低了幾個(gè)數(shù)量級(jí)。
已經(jīng)脫離開發(fā)多年了,不太清楚目前應(yīng)用架構(gòu)師關(guān)注的是什么。我做應(yīng)用架構(gòu)師的時(shí)候,總是在追求化繁為簡(jiǎn),盡可能讓一線開發(fā)人員變成工具人,而似乎現(xiàn)在的風(fēng)向有些變化,應(yīng)用開發(fā)已經(jīng)變得相當(dāng)復(fù)雜了。而讓部分企業(yè)級(jí)應(yīng)用回歸到以數(shù)據(jù)庫(kù)為核心,對(duì)于國(guó)產(chǎn)數(shù)據(jù)庫(kù)而言也是一個(gè)巨大的挑戰(zhàn),只有國(guó)產(chǎn)數(shù)據(jù)庫(kù)真的能打了,這個(gè)愿望才能實(shí)現(xiàn)。不過對(duì)于企業(yè)級(jí)應(yīng)用而言,適當(dāng)回歸存儲(chǔ)過程的使用,可能能夠解決目前的一些問題。
今天就聊到這里吧,明天我們來分析分析,國(guó)產(chǎn)數(shù)據(jù)庫(kù)的PL/SQL兼容能力,需要在哪些地方發(fā)力,或者說用戶選型數(shù)據(jù)庫(kù)的時(shí)候從哪些角度來看存儲(chǔ)過程的兼容性。