最近參與某新自定義查詢系統開發,系統是鋒哥設計的,核心代碼也是鋒哥寫的。做爲一個搬磚者自下而上的分析學習一下大神的系統設計。文中的談到架構設計內容是根據對代碼理解從新整理出來的,不表明系統的實際架構和實現。同時因爲業務和技術的複雜性及其餘緣由,不對實現細節做說明。前端
在該系統以前已經有兩個自定義查詢系統,一個爲競爭對手的CS系統,一個爲我司開發的BS系統。兩個系統均用了MS SQLSERVER爲數據存儲和查詢引擎,實現的業務功能不少,同時也有比較嚴重的性能問題。新系統的主要使命是用新技術提升自定義查詢性能,改善可用性,同時對飆競爭對手的系統。所以也有不少設計上不合理但必須的功能。數據庫
系統中用到了一些新技術,這些新技術或者非主流的技術是該系統實現的基石,這裏作一個簡單介紹。後端
系統的主要目的是將若干業務系統的數據信息,清洗轉換匯聚到ES中,利用ES在查詢方面的性能優點,來實現自定義查詢。系統邏輯上大概能夠分爲如下幾個模塊:緩存
什麼是數據模型?
數據模型出現的本質緣由是RDBMS與ES的數據建模方式不一樣,須要一套對應規則將各業務系統的數據庫表及數據對應到ES中。本系統中數據模型是什麼呢?不是代碼,是四張核心的excel。這四張excel是本系統的靈魂和精華所在,10萬行代碼本質上就是圍繞這四張excel編寫的,同時excel中的數據固化到元數據庫中。架構
數據模型解決了什麼問題?app
經過如下幾個主要的步驟實現數據從業務庫到ES中的同步:前後端分離
系統經過如下幾個步驟實現數據的裝載和轉換:性能
什麼是查詢引擎?
查詢引擎主要將前臺頁面選擇的條件和展現字段、排序方式、分頁方式、數據合併方式等在後臺轉換成ES的DSL查詢語言並查詢出結果。是系統最重要的模塊,同時也是代碼邏輯最複雜的模塊。學習
查詢條件的組合方式
從組合方式上來講,查詢條件有與、或、非、異或、全或幾種組合,分別對應着DSL的 must、should、must_not 和其組合。ui
值的比較方式
從值的比較方式上來講,主要有精確匹配、範圍匹配、前綴匹配、模糊匹配等,分別對應着DSL的term、terms、range、prefix、wildcard等
ES的數據建模方式
從ES的數據建模方式來看,查詢主要能夠分爲嵌套查詢、父子查詢、子父查詢、父子+嵌套查詢等
系統主要以流水線得思想將一個複雜的查詢拼裝,分配給各組件完成,並統一組裝,主要有嵌套查詢流水線、父子查詢流水線、子父查詢流水線等
模板引擎主要將大量重複勞動或者須要靈活變更或者特殊對應關係的代碼用模板生成,主要生成前端Html、pojo類,mapper映射和其餘元數據磁盤緩存等。
首先,優勢:
其次,缺點: