在當今複雜的數據驅動型應用中,理解和管理實體間(jiān)的複雜關係變得(dé)日益重要。通過低代碼平台進行配置(zhì)的(de)應用,因采用了DSL語言進行統一設計,要讓專業開發者和非專業開發者都能(néng)快速實現複雜應用的構建,實體之間的(de)數據邏輯和關係梳理就尤為(wéi)重要(yào),這裏涉及到頁麵信息、事件信息(xī)、服務信息之(zhī)間的數據流、業務流的追(zhuī)蹤和理解。因此利用血緣關係圖來實(shí)現數(shù)據、服務、流程等元(yuán)素之間的(de)依賴和影響鏈條(tiáo),可以更好的幫助開發者理解和分析應用(yòng)的開發(fā)過程。
構建和(hé)維護複(fù)雜係統的實體(tǐ)血緣關(guān)係圖會麵臨諸多挑戰,主要包括以下(xià)幾個方麵:
數據模型複雜性:實體血緣關係圖通(tōng)常要展(zhǎn)示(shì)數據在不同的事件、流程和服務之間的流(liú)轉和變換邏(luó)輯,這(zhè)要求我們能夠處理複雜的(de)業(yè)務邏輯和數(shù)據模型,尤其(qí)在低代碼環境下,可能(néng)需要高度靈活且強大的數據建模能力。
集(jí)成能力:實(shí)體血緣關係圖往往跨越(yuè)多個模塊、多個應用的服(fú)務,因此需要平台具備具備強(qiáng)大的集成能力,能(néng)夠滿足(zú)廣泛連接器(qì)和適配(pèi)器,同時還要求有高效的數據交換和同步能力。
高性能和高擴展性:隨著應用的不斷迭代,數據量和實體關係會持續增長,生成和實時更(gèng)新血緣關係圖對平台的性能和擴展性提出了更高的要(yào)求。
可視化複雜性:實體(tǐ)血緣關係圖可能非常複雜,如何清晰、直觀的呈現這種複雜性也是一個巨(jù)大的挑戰。平台需要提(tí)供更高級的圖表(biǎo)組件和布局組件,滿足複雜的視(shì)圖展示。
實體血緣(yuán)關係圖版本控製:隨著(zhe)應用和數據(jù)的架構演變,實體血緣關係(xì)也會隨之變化,追蹤實體血緣關係的(de)曆史和變更也是需要平台麵臨的挑(tiāo)戰之一(yī)。
在構(gòu)建實體血緣關係圖的時我們也嚐試通過不同(tóng)的方(fāng)式和技術實現(xiàn)來解決(jué)麵臨的一係列挑戰。最終我們發現可以將圖數據庫的實現原理和DDD領域驅動設計相結合,兩者的結合也凸顯了以下幾(jǐ)個優勢:
圖數據庫是以使用節點、邊(biān)和屬性來表示和存儲數據。節點可以代表一個實體(如頁麵、服務),邊則可以表示實體間的關係(如觸發事件、依賴(lài)),而屬(shǔ)性信(xìn)息則可以為節(jiē)點和邊附加(jiā)額外信息(如(rú)事件描述、時間戳)。圖數據庫體現的(de)最大(dà)優勢就是可以(yǐ)隨時從任何一個節(jiē)點找到與這個節(jiē)點相關的所有數據,不管是自上而下還是自下而上查(chá)找,都可以快(kuài)速(sù)檢索到相(xiàng)關的關(guān)聯和依賴數據。這種實現機(jī)製會讓我們對(duì)數據的操(cāo)作和檢索會更加高效(xiào),而通過關係型數據庫的邏輯去建立關係數據時,都是通過表數據之間進行關聯,檢(jiǎn)索時也是根據某(mǒu)個特定條件進行多表(biǎo)jion的關聯查詢。

關係型數據庫和圖(tú)數據庫實現原理分析
在實體血緣(yuán)關係圖的(de)設計過程中,我們(men)也(yě)充分使用了DDD領域驅動設計的模式,將係統的設計劃分為不同的核心領域、子域和限界上下文。每個領域中也會定義(yì)實體、對象和實體關係,因此在實(shí)體血緣關係圖建立過程中,可以將頁麵、服務、事件等與(yǔ)圖數據庫的節點、邊和屬性進行對應。
在構建實(shí)體血緣關係圖時,我們以頁麵作為節(jiē)點,事件作為關係紐帶,服務作為終點,參照圖數據庫(kù)的實現原(yuán)理,在實體血緣關係圖中明確標識出每個(gè)頁(yè)麵、事件和服務的名稱,並描繪出它們之間的連接(jiē)方向和觸發順序,確保邏(luó)輯流暢可見(jiàn)。
麵對複(fù)雜應用的(de)挑戰,我們采取了層次化與(yǔ)模塊(kuài)化策(cè)略進行視覺優化,利用分層、分模塊的方式進行可視化表(biǎo)示,以便清晰展示應用的整體結構和(hé)局部細節(jiē),從而能夠增強實體血(xuè)緣關係圖的可讀性和(hé)科維護性。
參考(kǎo)圖數據庫實現機製,我們在設計血緣關(guān)係圖的關(guān)係(xì)數據模型時,會(huì)把涉及到的(de)場景進行梳(shū)理並分類:
| 使用場景 | 場景(jǐng)分類 | 模型 | 查詢舉例 |
| | 點:頁麵 邊:頁麵之間(jiān)的關係 | |
| | 點:頁麵、事件 邊:頁麵與事件的(de)關係 | |
| | 點:頁麵、服務 邊:頁麵與服務的關係 | |
| ...... | ...... | ...... | ...... |
梳理完業務場景後(hòu),我們參考圖數據庫的模式,將關係模型全部梳理清楚,然後建模成一張圖如下:

頁麵關係建模示(shì)意
由(yóu)於不同實體類(lèi)型的屬性存在差異,采用(yòng)為每種實體新增特定模型及其相關寫入程序的方(fāng)法在(zài)實踐中顯得不太可行。為了解決這一問題,我們開發了一(yī)種通用的數據模型。該模型旨在統一定義(yì)各種數據類型,同時(shí)確保數據(jù)實例化後能夠順利映射到目標數據庫表中。
這種通用模型的設計允許(xǔ)我(wǒ)們(men)以一種靈活且高效(xiào)的方式處理不同實體的多樣化屬性,從(cóng)而避免了頻繁(fán)地為每種新實體創建和維護獨立模型的繁瑣過(guò)程。通過這種方式,我們能夠實現數據存儲和管理的標準化,同時保持對不同(tóng)數據類型的兼容性和適應性。
要建立實體血緣關係圖(tú),就必須通過(guò)對低代碼平台的DSL數據進行(háng)分析,對DSL各個數據節點進行(háng)充(chōng)分理解,才能完整的(de)建立頁麵與服務(wù)、頁麵與(yǔ)頁麵等之間的(de)實體調用關係。而(ér)為了更好的解析DSL數據結構,平台構建了(le)一套DSL解(jiě)析(xī)的引擎,在該引擎中,我們首先定義了@Node和@NodeField 注解,前者用作 DSL 中的節點標識,定義了節點(diǎn)的(de) JSON Path 以及是否為根節點等信息;後者用作節點下字段標(biāo)識(shí),定(dìng)義了字(zì)段在 DSL 中對應的(de)鍵或 JSON Path。
平台在構建血緣關係(xì)模型的時候,就需要考慮將(jiāng)@Node和@NodeField注解標記的節點與節點下的字段與關係模型對應起來。通(tōng)過DSL解析引擎(qíng)針對不同實體的DSL數據進行各自的解析實現。而在采集到 DSL數據後,能夠(gòu)根據特征值自動匹配需要的解析邏輯,從而快速的將節點、邊(biān)等關係進(jìn)行(háng)建立(lì),並轉(zhuǎn)化成模型數據進行存儲。
1)實體類(lèi)型識別:係統需要識別出數據(jù)屬於哪種類型的(de)實體。這是通過調用一個特定的解析(xī)器來完成的(de)。
2) DSL片段定(dìng)位:識別出實體類型後(hòu),解(jiě)析器會利用JsonPath表達式來定位具有特定特征的領域特定語言(DSL)片段。
3) 數(shù)據匹配與實(shí)例化:接(jiē)下來,解析器會根據規格表中(zhōng)定義的類型,將實例(lì)數據與這些類型進行匹配。一旦(dàn)找到匹配項,係統將按照規(guī)格表中定義的實例化字段,將數據轉換成相應的對象(xiàng),並將其存儲到數據(jù)庫中。
4) 關係數據建立:至於節點之間的關係數據,係統會自動通過實體的ID以及實體屬性的ID來建立。這些關係信息隨後會被寫入到關係表中,以此來(lái)維護實體/屬性間的聯係。
通過這個過程,係統能夠靈活地處理不同實(shí)體類型的數據,同時自動維護實體間的關聯關係,從而實現數據的高(gāo)效管理和查詢。
核心實現四(sì):血緣關(guān)係數據快速檢索
實體血緣關係圖從數據解析、存儲到查詢,總共分成三層:查詢引擎層、數據(jù)解(jiě)析引擎(qíng)層、存儲(chǔ)引擎層。

血緣關(guān)係圖三層處(chù)理
- 查詢引擎層
主要涉(shè)及到用戶 session 管理、服務的 proxy,其(qí)核心的一(yī)個功能是基(jī)於用戶(hù)發(fā)過(guò)來的請求,去做一個邏(luó)輯(jí)查詢(xún)計劃,並生成一(yī)個物理查詢計劃,然(rán)後通過執行器 executor 把對應(yīng)的子查詢給(gěi)分發出去,重高並發問題(tí)。
- 數據存儲層
我們會在這個模塊當中會考慮把(bǎ)數據做切片,分成一個個的數據塊,然後用一種特定的數據(jù)結構把它組織起(qǐ)來,同時這個數據結構要有相對來說比較良好且較低的讀(dú)寫放大能力,以及它能夠在磁盤(pán)的組織形式上對磁盤比較友好,然後是順序讀寫。在數據存儲時,我們選擇使用二級緩存模式,先通過KV方式將數據寫入到分布(bù)式緩存中,然後再持久化到(dào)ERM數據庫(kù)中。
核心(xīn)實現五:血(xuè)緣關係圖可視化處理
血緣關係圖在完成數據存儲引(yǐn)擎和數據檢索(suǒ)引擎的模塊建(jiàn)設後,最關鍵的一步就是要將數據以圖形化的方(fāng)式進行展示。圖形化展示的(de)幾個基本(běn)要求:
1)以任何一個節點可以展開上下遊(yóu)的數據節點關聯關(guān)係
2)界麵圖層渲染時,需要考慮到界麵渲染性能
3)界麵自動布局能力需考慮(lǜ)用戶體驗感知
在構建圖形的時候,我們對節點的(de)布局和(hé)邊(biān)的(de)樣式經過特別的設計,同時引入(rù)了前端X6的引擎,並對X6的布局算(suàn)法進行定製化改造和優化,從而保證圖的可讀性和美觀性。
交互設(shè)計方(fāng)麵,我們對交互進行(háng)了自定義(yì)的設計,包括拖拽、放大縮小、節點折疊等功能的拓展和自定義。從而滿足平台(tái)的複雜性和個性化需(xū)求。
主要實現內容如下(xià):
1) 節點(diǎn)類型識別:為不同的節點定義類型(xíng),並為每種類型創建一個標(biāo)識符。
2) 自定義節點樣式:根據節點類型,使用 X6 提供的圖形和樣式定(dìng)製功能來自定義節點的外觀。
3) 定義(yì)連線邏輯:為不同類型的節點定義它們之間的連接方式。我們使用圖形語法來定義節點之間的連線樣式和路徑。
4) 節點(diǎn)跳轉邏輯:為節(jiē)點定義交(jiāo)互邏輯,比如點擊某個節點時觸發的動作或跳轉到另一(yī)個(gè)實體。通過(guò)事件處理器,為節點添加(jiā)點擊事件來實現跳轉邏輯。
5) 動態數據綁定:實(shí)現一個機(jī)製,使得當增加新的節點類型時,隻需(xū)添加相應的樣式定義和(hé)跳轉邏輯,而無需(xū)重寫現(xiàn)有代碼。
6) 性能優化:考慮到數據量大時(shí)的性能問題,我們采用虛擬滾動、節點懶加載等技術來優化用(yòng)戶體驗。

血緣關係圖(tú)展示處理示意
實體血緣(yuán)關係圖的建(jiàn)設,不僅能夠顯著提升平台(tái)可管理性和透明度,還能給平台帶(dài)來更多方麵的長遠(yuǎn)價值:
增強係統的透明度(dù)和可追溯性:實體血緣關係圖清晰展示了(le)數據、服務(wù)、流程等實體間的依賴關係,使得專業開(kāi)發和非專業開發人員都能快速理解係統的工(gōng)作原理和數據流向。這對新員工培訓和應用的後期運維都尤為重要,並且可以大幅減少溝通和(hé)協調成本,降(jiàng)低應用二次開發的成本。
優化故障排查和問(wèn)題解決:當問(wèn)題出現(xiàn)時,血緣關係圖能夠快速幫助定位問題根源。通過追蹤受影響的實體上下遊關係,迅速識別出問題所在環節或者服(fú)務,縮短排(pái)障時間。
優化設計與重構:血緣關係圖揭示了係統的複雜度和潛在的瓶頸,為係統設計和重構提(tí)供可視化依據。在進行係統優化或遷移時,可以幫助團隊識別冗餘的組件、服務依賴,以及過度耦合的部(bù)分。