伴隨信息時代的發(fā)展,新技術(shù)、新框架、新語言層出不窮,解決問題的技術(shù)視角其實從來沒有改變。所有應(yīng)用都需要和存儲系統(tǒng)相關(guān)聯(lián),無論存儲是 SQL 還是 NOSQL 的。業(yè)務(wù)系統(tǒng)和數(shù)據(jù)庫遵循不同的開發(fā)規(guī)范,為了讓開發(fā)更容易,有一類框架專門幫助解決從應(yīng)用層到數(shù)據(jù)庫的轉(zhuǎn)換,著名的 ORM 類框架就是其中之一。實際上數(shù)據(jù)中臺技術(shù)主要面臨的挑戰(zhàn)主要也是計算服務(wù)和各種數(shù)據(jù)存儲如何便捷的統(tǒng)一起來,并通過服務(wù)化 API 和前臺業(yè)務(wù)層對接。
10余年建站經(jīng)驗, 網(wǎng)站設(shè)計制作、網(wǎng)站設(shè)計客戶的見證與正確選擇。創(chuàng)新互聯(lián)建站提供完善的營銷型網(wǎng)頁建站明細(xì)報價表。后期開發(fā)更加便捷高效,我們致力于追求更美、更快、更規(guī)范。
當(dāng)我們討論中臺應(yīng)用程序時,先理清包括設(shè)計和體系結(jié)構(gòu)在內(nèi)的一些方法,會更容易認(rèn)識設(shè)計思想的本質(zhì)。體系結(jié)構(gòu)是處理靈活性,可伸縮性,可用性,安全性以及其他直接與業(yè)務(wù)視角相關(guān)的結(jié)構(gòu)設(shè)計。
常用架構(gòu)如下:
??? Serverless 架構(gòu):
Serverless 體系結(jié)構(gòu)是包含第三方“后端即服務(wù)”(BaaS)服務(wù)的應(yīng)用程序設(shè)計,包括在“功能即服務(wù)”(FaaS)平臺上以托管、臨時容器運行的自定義代碼。
??? Event-Driven 架構(gòu):
Event-Driven 體系結(jié)構(gòu)模式,是基于事件促成生成、檢測、消費和響應(yīng)。
??? Microservices 架構(gòu):
它是面向服務(wù)的體系結(jié)構(gòu)(SOA)的一種變體,將應(yīng)用程序構(gòu)建為松散耦合的服務(wù)的集合。 在微服務(wù)架構(gòu)中,服務(wù)是細(xì)粒度的,協(xié)議是輕量級的。
中臺應(yīng)用程序會涉及與多個系統(tǒng)的多個集成,所以從程序的工程角度,應(yīng)使用古老的羅馬策略:分而治之,將復(fù)雜性分解為小塊,此外,應(yīng)可擴展,自由使用實現(xiàn)方式達(dá)成目標(biāo)結(jié)果,不拘泥于簡單的實現(xiàn)手段。
這里的挑戰(zhàn)是應(yīng)用開發(fā)和數(shù)據(jù)開發(fā)都有不同各自數(shù)據(jù)對象和處理方式,應(yīng)用開發(fā)是 OOP、函數(shù)式編程,常規(guī)集合、key-value 數(shù)據(jù),數(shù)據(jù)開發(fā)則需要反復(fù)處理動態(tài)結(jié)構(gòu)數(shù)據(jù)和復(fù)雜的關(guān)聯(lián)運算。因此,從系統(tǒng)結(jié)構(gòu)的角度來看,需要應(yīng)用開發(fā)和數(shù)據(jù)開發(fā)之間的轉(zhuǎn)換器。
Java8 引入了 Lambda 表達(dá)式和流,對許多從事數(shù)據(jù)開發(fā)人員來說非常有吸引力,但硬編碼需要很長時間,并且由于人為因素可能產(chǎn)生錯誤的重復(fù)性工作,浪費大量時間。為了使這個過程更加簡便并減少錯誤數(shù)量,借助成熟的計算框架和 DSL 語言逐漸成為了主流。
舉例說明,以集算器為例,腳本如下:
A | B | |
1 | [MySQL1,mysql2,mysql3,mysql4] | |
2 | fork A1 | =connect(A2) |
3 | =B2.query@x("select ? product_no,sum(allDuration) sallDuration,sum(allTimes) ? sallTimes,sum(localDuration) slocalDuration ,sum(localTimes) slocalTimes from ? userService where I0419=? group by product_no", argType) | |
4 | =A2.conj() | |
5 | =A4.groups(product_no;sum(sallDuration):ad,sum(sallTimes):at,sum(slocalDuration):ld,sum(slocalTimes):lt) |
某電信企業(yè)用庫表 userService 存儲用戶服務(wù)信息,T+0 查詢需要呈現(xiàn)各類電信產(chǎn)品的通話時長、通話次數(shù)、撥打本地時長、撥打本地次數(shù)。實際使用中發(fā)現(xiàn)數(shù)據(jù)量太大,查詢效率很低,導(dǎo)致前端顯示很慢。
引入中間計算層,將位于多個數(shù)據(jù)庫的 userService 數(shù)據(jù)合并匯總。多線程并行不僅大幅提升了性能,用 SPL 腳本來實現(xiàn)也更加容易,Java 調(diào)用 SPL 也很方便。如果上述計算動作用硬編碼實現(xiàn),多線程、數(shù)據(jù)合并再二次匯總,工作量將非常巨大。
使用中臺計算組件是一個很好的策略,它去適配各類 SQL、NOSQL、大數(shù)據(jù)平臺,使用一致的結(jié)構(gòu)化數(shù)據(jù)模型 / 語法進(jìn)行開發(fā),對外提供通用接口和標(biāo)準(zhǔn)結(jié)果集,應(yīng)用可以根據(jù)自身需要繼續(xù)封裝和對外提供服務(wù)。中臺計算組件最好具備數(shù)據(jù)緩存特性,不會在大量訪問時,直接對存儲系統(tǒng)產(chǎn)生影響。從維護(hù)角度,它可以方便地修改計算邏輯而不會影響其他代碼,不斷優(yōu)化算法和利用緩存,這對其他開發(fā)人員和存儲系統(tǒng)維護(hù)人員來說都是最愿意看到的方式。但由于向開發(fā)方面增加了一層,因此破壞了簡單性。