您好,登錄后才能下訂單哦!
伴隨信息時(shí)代的發(fā)展,新技術(shù)、新框架、新語(yǔ)言層出不窮,解決問(wèn)題的技術(shù)視角其實(shí)從來(lái)沒(méi)有改變。所有應(yīng)用都需要和存儲(chǔ)系統(tǒng)相關(guān)聯(lián),無(wú)論存儲(chǔ)是 SQL 還是 NOSQL 的。業(yè)務(wù)系統(tǒng)和數(shù)據(jù)庫(kù)遵循不同的開(kāi)發(fā)規(guī)范,為了讓開(kāi)發(fā)更容易,有一類(lèi)框架專(zhuān)門(mén)幫助解決從應(yīng)用層到數(shù)據(jù)庫(kù)的轉(zhuǎn)換,著名的 ORM 類(lèi)框架就是其中之一。實(shí)際上數(shù)據(jù)中臺(tái)技術(shù)主要面臨的挑戰(zhàn)主要也是計(jì)算服務(wù)和各種數(shù)據(jù)存儲(chǔ)如何便捷的統(tǒng)一起來(lái),并通過(guò)服務(wù)化 API 和前臺(tái)業(yè)務(wù)層對(duì)接。
當(dāng)我們討論中臺(tái)應(yīng)用程序時(shí),先理清包括設(shè)計(jì)和體系結(jié)構(gòu)在內(nèi)的一些方法,會(huì)更容易認(rèn)識(shí)設(shè)計(jì)思想的本質(zhì)。體系結(jié)構(gòu)是處理靈活性,可伸縮性,可用性,安全性以及其他直接與業(yè)務(wù)視角相關(guān)的結(jié)構(gòu)設(shè)計(jì)。
常用架構(gòu)如下:
??? Serverless 架構(gòu):
Serverless 體系結(jié)構(gòu)是包含第三方“后端即服務(wù)”(BaaS)服務(wù)的應(yīng)用程序設(shè)計(jì),包括在“功能即服務(wù)”(FaaS)平臺(tái)上以托管、臨時(shí)容器運(yùn)行的自定義代碼。
??? Event-Driven 架構(gòu):
Event-Driven 體系結(jié)構(gòu)模式,是基于事件促成生成、檢測(cè)、消費(fèi)和響應(yīng)。
??? Microservices 架構(gòu):
它是面向服務(wù)的體系結(jié)構(gòu)(SOA)的一種變體,將應(yīng)用程序構(gòu)建為松散耦合的服務(wù)的集合。 在微服務(wù)架構(gòu)中,服務(wù)是細(xì)粒度的,協(xié)議是輕量級(jí)的。
中臺(tái)應(yīng)用程序會(huì)涉及與多個(gè)系統(tǒng)的多個(gè)集成,所以從程序的工程角度,應(yīng)使用古老的羅馬策略:分而治之,將復(fù)雜性分解為小塊,此外,應(yīng)可擴(kuò)展,自由使用實(shí)現(xiàn)方式達(dá)成目標(biāo)結(jié)果,不拘泥于簡(jiǎn)單的實(shí)現(xiàn)手段。
這里的挑戰(zhàn)是應(yīng)用開(kāi)發(fā)和數(shù)據(jù)開(kāi)發(fā)都有不同各自數(shù)據(jù)對(duì)象和處理方式,應(yīng)用開(kāi)發(fā)是 OOP、函數(shù)式編程,常規(guī)集合、key-value 數(shù)據(jù),數(shù)據(jù)開(kāi)發(fā)則需要反復(fù)處理動(dòng)態(tài)結(jié)構(gòu)數(shù)據(jù)和復(fù)雜的關(guān)聯(lián)運(yùn)算。因此,從系統(tǒng)結(jié)構(gòu)的角度來(lái)看,需要應(yīng)用開(kāi)發(fā)和數(shù)據(jù)開(kāi)發(fā)之間的轉(zhuǎn)換器。
Java8 引入了 Lambda 表達(dá)式和流,對(duì)許多從事數(shù)據(jù)開(kāi)發(fā)人員來(lái)說(shuō)非常有吸引力,但硬編碼需要很長(zhǎng)時(shí)間,并且由于人為因素可能產(chǎn)生錯(cuò)誤的重復(fù)性工作,浪費(fèi)大量時(shí)間。為了使這個(gè)過(guò)程更加簡(jiǎn)便并減少錯(cuò)誤數(shù)量,借助成熟的計(jì)算框架和 DSL 語(yǔ)言逐漸成為了主流。
舉例說(shuō)明,以集算器為例,腳本如下:
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è)用庫(kù)表 userService 存儲(chǔ)用戶服務(wù)信息,T+0 查詢需要呈現(xiàn)各類(lèi)電信產(chǎn)品的通話時(shí)長(zhǎng)、通話次數(shù)、撥打本地時(shí)長(zhǎng)、撥打本地次數(shù)。實(shí)際使用中發(fā)現(xiàn)數(shù)據(jù)量太大,查詢效率很低,導(dǎo)致前端顯示很慢。
引入中間計(jì)算層,將位于多個(gè)數(shù)據(jù)庫(kù)的 userService 數(shù)據(jù)合并匯總。多線程并行不僅大幅提升了性能,用 SPL 腳本來(lái)實(shí)現(xiàn)也更加容易,Java 調(diào)用 SPL 也很方便。如果上述計(jì)算動(dòng)作用硬編碼實(shí)現(xiàn),多線程、數(shù)據(jù)合并再二次匯總,工作量將非常巨大。
使用中臺(tái)計(jì)算組件是一個(gè)很好的策略,它去適配各類(lèi) SQL、NOSQL、大數(shù)據(jù)平臺(tái),使用一致的結(jié)構(gòu)化數(shù)據(jù)模型 / 語(yǔ)法進(jìn)行開(kāi)發(fā),對(duì)外提供通用接口和標(biāo)準(zhǔn)結(jié)果集,應(yīng)用可以根據(jù)自身需要繼續(xù)封裝和對(duì)外提供服務(wù)。中臺(tái)計(jì)算組件最好具備數(shù)據(jù)緩存特性,不會(huì)在大量訪問(wèn)時(shí),直接對(duì)存儲(chǔ)系統(tǒng)產(chǎn)生影響。從維護(hù)角度,它可以方便地修改計(jì)算邏輯而不會(huì)影響其他代碼,不斷優(yōu)化算法和利用緩存,這對(duì)其他開(kāi)發(fā)人員和存儲(chǔ)系統(tǒng)維護(hù)人員來(lái)說(shuō)都是最愿意看到的方式。但由于向開(kāi)發(fā)方面增加了一層,因此破壞了簡(jiǎn)單性。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。