系統架構合理性的思考

来源:https://www.cnblogs.com/jingdongkeji/archive/2023/08/21/17645269.html
-Advertisement-
Play Games

從研發的角度來看如果系統上下文清晰、應用架構設計簡單、應用拆分合理應該稱之為架構合理。基於以上的定義可以從以下三個方面來梳理評估: ...


最近牽頭在梳理部門的系統架構合理性,開始工作之前,我首先想到的是如何定義架構合理性?

從研發的角度來看如果系統上下文清晰、應用架構設計簡單、應用拆分合理應該稱之為架構合理。

基於以上的定義可以從以下三個方面來梳理評估:

1、系統的上下文清晰:明確的知道和周圍系統的調用關係,數據同步機制;

2、應用架構設計簡單:架構分層合理,功能定位清晰,不會出現功能邊界之外事情;

3、應用拆分合理:系統內的應用粒度在一個合理的範圍內;應用間調用鏈路不應過長。

系統的上下文清晰

系統上下文圖一詞最早是從Simon Brown的C4模型中借用而來的,該模型”通過在不同的抽象層次重新定義方框和虛線來抽象表達架構的含義“。

C4模型把系統分為四層,每層都代表著不同的視圖架構,關註點不同。第一層,講的系統上下文,系統高層次的抽象。

如下圖顯示個人銀行賬號在瀏覽賬戶過程中發生不同的系統之間交互。 如果把Internet Banking Sysytem 當成我們的目標系統,那麼E-mail System、MarinFrame Banking Sytem 就是它的伴生系統,也可以稱為外部系統,它給Internet Banking Sysytem 提供系統價值,屬於系統外,是黑盒。

系統上下文明確了目標系統和外部系統的關係,它和外部系統一起給目標用戶提供價值。繪製系統上下文的時候,需要註意目標系統和外部系統之間的依賴方向。北向依賴意味著外部系統調用目標系統的服務,需要考慮目標系統定義了什麼樣的服務契約;南向依賴意味著目標系統調用了外部系統的的服務,需要瞭解外部系統的介面、調用方式,通信機制,甚至當外部系統出現故障時,目標系統該如何處理。

除了參考以上的畫法,也可以用業務序列圖表示。它脫胎與UML的序列圖。序列圖可以從左側的角色開始,體現消息傳遞的次序。這隱含這一種驅動力:我們從左側的參與對象開始,尋找與之協作的執行步驟,然後層層傳進地推導出整個完整的協作流程。

企業序列圖,代表了企業級系統的抽象,目標系統和外部系統之間的協作關係,參與的系統是一個完整的整體,所以不需要也不應該參與系統的內部實現的細節,消息的方向更多的代表系統的責任。業務序列圖如下所示:

應用架構設計簡單

應用本身是有架構分層的,Martin Fowler 在《企業應用架構模式》 提出合理的系統分層應該包括表現層,領域邏輯層,數據源層。 表現層主要提供服務,處理用戶請求。領域層是處理邏輯,是系統的核心。數據源層與數據層、消息系統,與其他軟體包通信。

後續發展的領域驅動架構設計,演變成四層,在表現層下加入了應用層,同時把數據源層改為基礎設施層,突破了資料庫管理系統的限制。

基於以上的系統分層,無論你是採用的三層架構還是四層架構,應用代表著功能邊界,提供那些核心的能力,能做那些事情,那些事情不能做。

一個好的實踐經驗是參考領域驅動設計的業務域的方法論,梳理好系統的一二三級域,最多不超過四級,做好各級域的定義。好的域的定義代表著系統能力的邊界,讓你明白那些事情能做,那些事情不能做。

基於以上梳理好的系統業務域的定義和能力邊界,我們在梳理的時候通常會兩類系統,第一類是現有存量的系統且需求迭代相對頻繁的系統,這類系統關鍵是要梳理出有哪些核心的能力,是否在上述系統的域的定義範圍內的,是否其他系統有類似的能力,如果有的話,需要考慮合併。另外還需要考慮核心能力公開化、文檔化,至少讓部門內知道,有地可查,避免系統的重覆造輪子。

遇到第二類系統是存量系統且沒有需求迭代,業務上基本沒有調用量的。這類系統需要和業務溝通是否有下線計劃,是否有類似的系統可以替代,給業務決策提供技術參考。

應用拆分合理

需求開發中,一個項目或者需求的實現可能需要多個目標系統協同來實現,這涉及到目標系統的拆分的粒度,系統拆分成應用的粒度沒有統一標準,但是要在相對合理範圍內,可以參考的因素包括業務規劃,系統調用量級,基於業務規劃的架構設計,部門內的人數及分工。過多過少都是不好的。

如果一個新業務短期內看不到大的發展,在初步規劃應用的時候,可以先粗粒度拆分,部門內人數平均不能應該超過2-3個應用,再多必然面臨著一個需求實現的時候不同系統的切換成本。如果後續業務發展起來,部門內人數增多,因為分工更精細,可以考慮更細粒度的拆分,系統拆分必然會帶來另一個問題,系統之間該如何的協同以及系統的調用鏈路的長度。

基於以上講的系統分層的概念,部門內系統可以分為兩類,一類系統是業務網關,一類是通用的業務能力。業務網關面向用戶,用來協同應用的活動,不包含業務邏輯,不保留業務對象的狀態,相當於領域驅動設計應用層+表現層,有人稱作它為業務SOA,或者BFF層。

通用業務能力相當於領域邏輯層+基礎設施層,作為軟體的核心所在,保留了業務對象的狀態,對業務對象的持久化被委托給基礎設施層,基礎設施層作為其他層的支撐層,實現了和其他系統的通信,實現業務對象的持久化。

在以上兩類系統中,業務網關是依賴通用業務能力層,業務網關是北向依賴,通用業務能力層是南向依賴。 在一個功能的實現不建議鏈路長度不超過2。同時也要註意到系統之間相互依賴的情況,要重視,此點是系統穩定性的風險點。

成本量化:

基於以上三方面分析,梳理出的交付物:1、系統的上下文依賴;2、 系統的業務域定義及能力規劃地圖。3、應用調用鏈路的長度及相互的依賴關係;4、應用拆分粒度合理性的評估;5、系統中能力的下沉或者合併;6、業務量少的系統列表。

其中1-4,可以看作系統的行動指南或者原則,5-6是下一步的行動,更簡單的說是我們常做的系統的關停並轉。在業務部門系統關停並轉還需要考慮到成本問題,做好成本的量化。

首先需要評估關停並轉的付出的成本,其次要評估系統日常維護1-3年的成本包括人力成本和機器資源的成本,前者和後者的三年累計值相減,如果大於零,系統建議暫時不動,如果少於零,可以考慮關停並轉的計劃。

以上是我從研發角度系統架構合理性的思考。

架構合理性如果從業務角度來評估,可能就變成以下三個方面:一是能解決當下業務需求和問題。2、高效完成業務需求: 能以優雅且可復用的方式解決當下所有業務問題。3、前瞻性設計: 能在未來一段時間都能以第2種方式滿足業務,從而不會每次當業務進行演變時,導致架構翻天覆地的變化。

視角的不同必然代表著大家對同一件事情的看法不同。

作者:京東零售 高田林

來源:京東雲開發社區 轉載請註明來源


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ##### 6 樣式繼承 CSS的樣式表繼承指的是,特定的CSS屬性向下傳遞到子孫元素。總的來說,一個HTML文檔就是一個家族,然後html元素有兩個子元素,相當於它的兒子,分別是head和body,然後body和head各自還會有自己的兒子,最終形成了一張以下的家族譜。 ![image](http ...
  • ##### 9 閉包 我們都知道,函數里是可以訪問函數外的全局變數,而函數外不能訪問函數內的局部變數,如下: ```js // 函數外定義a,在函數內可以訪問 var a = "測試"; function fn() { console.log(a); } fn(); ``` 執行結果: ![imag ...
  • ##### 5 偽類選擇器 anchor偽類:專用於控制鏈接的顯示效果 |More Actions[:link](https://www.w3school.com.cn/cssref/selector_link.asp) |a:link |選擇所有未被訪問的鏈接。 | | | | | |[:visi ...
  • # 通過 NVM 安裝、管理Node.js 版本(Windows) ## 介紹 NVM 可以讓我們通過指令安裝指定版本,並且可以切換當前Node.js 版本,不用花時間在解決升版和降版。 ## 安裝 鏈接: https://github.com/coreybutler/nvm-windows 選擇最 ...
  • ##### 4 屬性選擇器 屬性選擇器是通過元素的屬性及屬性值來選擇元素的。下麵介紹屬性選擇器的用法。 1. 第一種用法 ``` 作用:選擇含有指定屬性的元素。 語法:[屬性名]{} ``` 示例如下: ```html 屬性選擇器 用戶名: 密 碼: 數據量: ``` 運行結果: ![image]( ...
  • ##### 8 JavaScript函數 在JS中聲明函數和python差不多. 也要有一個關鍵字頂在前面. python是`def`, 到了JS里換成了`function`, 只不過在JS中沒有像python那麼死板, 必須`def`後面必須跟上函數名. 這也為我們未來做逆向提供了第一個超大的伏筆 ...
  • 在當今快節奏的社會中,技術變化日新月異。作為一名技術博客站長,我深切感受到了學習和傳播知識的重要性。為了更好地滿足讀者的需求,我決定採用VuePress搭建一個功能強大且易於維護的知識庫平臺,名為LearnData。本文將介紹我如何利用VuePress構建LearnData,並展示一些相關的代碼示例... ...
  • ## 直連 直連模式下,選擇一個玩家充當伺服器(房主)。如果游戲出現不同步,那麼均按房主的世界來,玩家1可以作弊修改其游戲來影響其他玩家的世界 針對兩個玩家來說,直連連接質量更好,延遲小 如果玩家數量很多,不同玩家間的通信則需要靠房主為中介,那通信質量與房主主機配置、網路情況有很大關係 ## 專用服 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...