從0到1架構項目
一、架構的理解
架構是業務、技術開展工作指導,優秀的架構在系統可以輕鬆面對各種的不確定(系統不可靠、網絡不可靠、業務快速發展、需求變更),良好的設計可以規避大量技術債,在技術轉型、業務轉型中發揮重要作用。
架構是開發工作綱領,在開展業務、研發前,需要進行項目評估,選擇合適架構類型,可靠的實現方案,爲發開工作進行指導。
架構方案確定可以控制項目風險,將各種不確定納入可控的範圍內。
架構也可以協調不同部門之間工作,需要多少硬件資源、每個部門需要做那些事情、一個部門的工作開始節點始於於上一個部門完成,各部門工作量分配等等提供參考,各部門職責明確,項目經理可以關鍵節點進行驗收,爲進度提供保障。
二、成熟度模型
架構工作不是一蹴而就,是根據業務不斷演進。在項目初期選用簡單架構可以快速滿足業務需要,在業務不斷增長中,不斷迭代,完成單體到分佈式,分佈式到微服務,微服務到serverless演進。
2.1 初期階段
在項目初期可能團隊人員就只有幾個人,要直接上到微服務架構,主要的挑戰是:
- 人力不足
- 技術儲備不夠
- 時間不充裕
- 過度設計,業務規模沒有達到量級
- 風險不可控
初期階段技術負責人需要關注的幾個要點:
- 制定開發規範
- 制定工作流程
- 技術培訓
- 業務培訓
- 項目文檔化
- 項目整體架構方案選型,架構演進預留適配設計
- 爭取儘量多開發時間
- 不招聘新手
2.1.1 開發規範
-
書籍
- 《阿里巴巴Java開發手冊》
- 《重構改善既有代碼》
- 《Effect Java》
- 《HeadFirst設計模式》
- 《併發編程實戰》
-
開發插件
- P3C
- SonarLint
2.1.2 工作流程
- 需求評審
- 技術方案評審
- 開發排期
- 測試
- 需求變更評估
- 項目驗收
- 上線計劃
- 灰度發佈
- 線上BUG熱修復
- 數據訂正
2.1.3 技術培訓
- 通用模塊分析
- 接口設計
- 數據模型設計
- 協議選擇
- 技術選型分析
- UML、流程圖、架構圖繪圖方法
- 技術預研
- 典型錯誤分析
2.1.4 業務培訓
項目開發人員隨着業務發展不斷,同時也伴隨這人員流動,一套完成業務培訓流程可以讓開發快速瞭解公司的業務,找到核心關鍵人員,識別項目可能出現的風險,對現有業務不熟悉,在技術方案設計時會有所遺漏。
業務培訓一般是產品、項目經理、技術負責人負責編寫,也採用迭代的方式,每個週期,更新現有培訓文檔,避免文檔過時、遺棄。
2.1.5 項目文檔化
開發人員不光要避免口頭需求,同時開發內部也應該避免口頭講解項目。
當接收到複雜需求,做技術實現方案時,主導人員需要將實現方案文檔化。
文檔化主要指:
- 服務架構圖
- 數據模型圖
- 系統交互圖
- 狀態變更流程圖
- 關聯表結構、字段說明
- 接口設計
- 時序圖
- 類圖
- 操作棧數據流轉圖
優秀的文檔,開發人員拿到手即可進行開發,開發與開發之間、開發與運維間、乃至開發與產品、開發與業務方的溝通語言,基於文檔、圖、視頻的方式,減少口頭信息傳遞造成的誤差。
2.1.6 頂層適配設計
敏捷開發,並非是完全拋棄架構、詳細設計,完全使用最簡單最快捷成本最低的方案,反而是前期沒有評估好,造成後期迭代困難,架構無法快速支撐業務,付出幾倍於以前的成本完成改造,改造過程也同樣充滿風險。
舉個例子:
在項目前期中,不同領域模塊之間進行交互的方式,可以基於Pub/Sub發佈訂閱模型完成,達到模塊解耦,後期項目拆分微服務,也可以很快完成切換。
Spring
的事件監聽EventListener
Guava
的事件總線EventBus
RabbitMQ
的消息隊列
普通非報表查詢,將多表關聯拆分爲單表查詢,在後續數據庫分庫分表能做到最小變更,報表查詢可以使用CQRS
讀寫分離模式,單獨寫一個查詢服務聚合多數據源多表數據關聯查詢,在項目業務達到一定規模,實現數據中臺,離線分析、實時分析,ETL
輸出結果表、維度表。
項目前期單體應用鎖的設計
頂層抽象ILock
繼承Lock
,增加leaseTime
超時釋放,簡單死鎖規避、註解式等等
常見鎖的方案
-
基於
RDS
-
基於
Reetrantlock
-
基於
Redis
-
基於
Zookeeper
-
基於
Etcd
......
在單體到集羣過度,可以選擇不同方案,注入實現類,即可完成切換
2.1.7 儘量多開發時間
上述很多工作都是需要正常開發之外的時間完成,如果在項目排期時僅僅考慮需求開發時間,是無法完成架構設計工作,需要技術負責人與產品、業務進行溝通,正常開發時間乘上一定係數,指定排期計劃。
2.1.8 新人成本誤區
項目初期,第一版的成本關係着項目組是否還存在,新人的成本遠遠高於高級開發,並且新人常常對於項目評估、自身能力判斷是不夠準確的,項目經驗、風險把控幾乎是零,再則上述很多事項,並不是一個新手就可以在緊湊的開發週期抽出時間完成。
2.2 中期階段
ing..