一種遮蔽複雜業務邏輯的資料轉換獲取方案

2021-09-26 01:25:11 字數 2055 閱讀 7170

孫巨集良  2023年8月9日

基於複雜業務場景,尤其是微服務架構下的複雜業務場景。我們將業務拆分、解藕,將服務能力拆分復用,從而盡可能隔離複雜服務間的相互影響。

當服務鏈條長,依賴複雜的時候,每個業務服務只關心自己的業務邏輯,但是如何去獲取關聯服務的資料卻成了比較頭疼的問題。

考慮一下這樣的業務場景:客服系統接入使用者後,如何獲取散落在各個系統的資料從而支援客服回答使用者的問題呢?

說真的,圖中示意的系統和資料與真實情況下相比簡直是九牛一毛。這是要客服的rd把每個服務的介面都調一遍嗎?簡直是在虐待我們可憐的rd同學~ 就算不用把每乙個服務都調一遍,部分服務可以由相關的服務包裝起來,但是包裝的服務怎麼知道你要不要被包裝服務的資料呢?如果不關心你要什麼資料,那麼它相關聯的n多系統真的都要呼叫一遍嗎?如果不包裝,那些間接的關係,客服的rd又如何能知道這麼多複雜系統的相互關係呢?

痛點問題:能不能在不關心複雜業務邏輯的情況下,通過乙個主鍵id獲取到其他所需要的資料?

之前在我們的專案中,廣泛使用了「寬表」的方案,該方案只需要有乙個服務關心整體的業務邏輯,通過監聽binlog、業務訊息等推送發現資料變化,獲取並按照業務邏輯組裝資料,寫到乙個大寬表中。寬表的載體我們不做討論。這種方案能夠將資料獲取的複雜性遮蔽在自己的服務內,並且支援篩選、分頁查詢等資料表天然支援的特性。真乃苦了乙個人幸福千萬家的好設計~

但這種設計我卻不敢苟同~優勢明顯,缺點也不太容易接受。為啥要苦乙個人啊?這個同步來資料的實時性怎麼樣啊?乙個表動不動就有上百列啊有木有?最不能接受的是,所有業務系統的底表變化、資料邏輯變化都會直接引起這個服務的崩潰啊!!誰會想著告訴你我們的業務變了呢?

構建有向加權圖,資料型別當作頂點,資料的轉換方式當做路徑。通過計算頂點間的最短路徑,就可以得到獲取目標資料所需要的呼叫。

我們將可以將上面的示意圖生成如下圖所示:圖資料結構

其中,圓代表資料頂點,箭頭代表某種轉換,可以使用根部資料獲取頭部資料,相同顏色的箭頭為同一轉換。由於乙個轉換可以一次性轉換出多個資料,因此我們簡單畫一條箭頭到所屬的業務服務上。圖中我們假設,「訂單號」可以轉換到使用者資訊和訂單id;而訂單號除了獲取使用者資訊外,還可以獲取到提供商品的倉庫、商品、物流等資訊;而要獲取**商資訊,就不得不通過商品獲取了。

通過訂單id獲取全部資料的路徑是什麼? 黃(使用者資訊、商品資訊、物流)、綠(供貨商)、紅(供貨倉庫)

通過訂單號獲取全部資料的路徑是什麼?藍(訂單id,使用者資訊)、黃(商品資訊、物流)、綠(供貨商)、紅(倉庫)

我們只需要將有哪些頂點寫入配置、將有哪些轉換寫入配置,接可以得到這張轉換圖。而我們不關心從乙個頂點到乙個目標訂單到底要怎麼轉換,交給最短路徑的演算法即可。

當然,上述模型表述較為簡單,

業務服務只需要提供自己緊密關聯的資料轉換方式即可,方式的形式不限,可以使用策略模式支援不同方式;

資料使用方只需要關心自己當前的資料以及想要得到的資料,無需關心資料的轉換過程;

業務服務直接提供資料介面時,資料一致性極高;

業務服務無需分別做資料轉換的工作;

對業務變化有一定的適應能力;

存在多條路徑時,能夠找到最優的路徑(實效、可靠性等)

串聯呼叫,獲取時常由介面呼叫總時長決定,可能較慢;

串聯呼叫,路徑服務損壞將造成整體的不可用;

所有資料頂點唯一,不可以重名;

不支援任意資料的篩選、查詢;

可以通過重試機制解決串聯路徑中,單個服務不穩定的問題;

可以通過備份儲存的方式,儲存返回結果,對窗簾路徑中單個服務當機降級;

結合寬表的能力優勢,寬表拼裝資料時可以使用本方案,將兩種能力進行結合解決篩選查詢的問題;

作者介紹:

我是來自 車好多集團-毛豆新車 的一名毛豆粒,負責**鏈履約中颱的架構設計。在我看來,新車業務商品價值高、管理複雜,流程多、系統也多。如何構建一套高可用、低耦合、可快速迭代且能適應業務飛速發展的技術架構是我內心的追求。

也希望看到文章的朋友,對我們的團隊感興趣、加入我們。

複雜業務邏輯下的合理遍歷

我們在前端介面進行任務手動分配,要求將多條錄音隨機分配給多個質檢員。指定每個質檢員的錄音個數。1 錄音map key id,value time 2 質檢員id list 3 質檢員任務list number 4 需要質檢的錄音數量 1 將所有工單按照指定的分配數量分配給相應的質檢員 param w...

邏輯回歸演算法的一種實現

邏輯回歸演算法的一種實現 1 import numpy as np import matplotlib.pyplot as plt 載入資料集,將資料集中兩列資料分別儲存到datamat和labelmat def loaddataset datamat labelmat fr open home j...

一種高效的資料物件轉換方式 2

第一節簡單介紹怎麼使用資料物件轉換 一種高效的資料物件轉換方式 1 下面將介紹xml中屬性的詳細使用方法 prefix 字首,顧名思義就是在name引數值前加上字首。配置如下 輸出如下 data name json輸出中的key,包括data資料中的key和header資料中的key。type 類全...