如何做好系統(tǒng)設計

摘要

在互聯(lián)網系統(tǒng)架構設計中,如何用最少的資源支撐起億級流量是每位工程師孜孜不息奮戰(zhàn)的目標。雖然業(yè)務場景林林總總,但是萬變不離其宗。本文分享了一些系統(tǒng)設計理論與方法,也是這兩年多在工作中對系統(tǒng)設計的一些思考與總結。

一、善用UML工具

用例圖
用于需求分析階段,從用戶角度描述系統(tǒng)功能。

用例圖

靜態(tài)圖:類圖、對象圖、包圖

靜態(tài)圖

交互圖-時序圖(注重時間)
常用組合片段:選項(Opt)、循環(huán)(Loop)、并行(Par)、抉擇(Alt)、中斷(Break)

時序圖

交互圖-協(xié)作圖(注重對象)

協(xié)作圖

行為圖-狀態(tài)圖(注重狀態(tài))

狀態(tài)圖

行為圖-活動圖(注重活動)

活動圖

實現(xiàn)圖-組件圖

組件圖

實現(xiàn)圖-部署圖

部署圖

二、遵從設計原則

設計模式基礎

  • 單一職責:一個類只負責一個職能;
  • 里氏轉換:在子類中不應重寫、重載父類的方法,子類要能替代父類;
  • 接口隔離:不依賴不需要的接口,拆分大接口;
  • 迪米特法則:一個對象應該對其他對象保持最少的了解(低耦合);
  • 開放封閉:對擴展開放,對修改關閉;
  • 依賴倒置:抽象不應該依賴細節(jié),細節(jié)應該依賴抽象,即針對接口編程,所有依賴關系都終止于抽象類或接口,不要對實現(xiàn)編程。

設計模式

創(chuàng)建型

  • 工廠方法(Factory Method):Creator、Product、ConcreteCreator、ConcreteProduct,父類決定實例生成方式,由子類生成實例。
  • 抽象工廠(Abstract Factory):AbstractFactory、ConcreteFactory、AbstractProduct、ConcreteProduct、Client,將零件組裝成復雜結構的產品。
  • 單例(Singleton):Singleton,只有一個實例。
  • 建造者(Builder):Builder、ConcreteBuilder、Director(監(jiān)工,聚合Builder)、Client,分階段組裝生成復雜結構的實例。
  • 原型(Prototype):Prototype、ConcretePrototype、Client,通過clone生成實例。

結構型

  • 適配器(Adapter):Target(對象)、Adapter(繼承Target,聚合Adaptee)、Adaptee(被適配)、Client,連接填補不同接口的縫隙。
  • 代理(Proxy):Subject、Proxy(代理人,聚合RealSubject)、RealSubject(實際主體)、Client,Proxy與RealSubject實現(xiàn)同一接口,用于推遲實例的生成。
  • 橋接(Bridge):Abstraction(功能,聚合Implementor)、RefinedAbstraction、Implementor(實現(xiàn))、ConcreteImplementor,將類的功能層次結構與實現(xiàn)層次結構分離。
  • 裝飾(Decorator):Component(被裝飾物)、ConcreteComponent、Decorator(裝飾物,繼承并聚合Component)、ConcreteDecorator,為Component添加Decorator,裝飾邊框與被裝飾物具有一致性。
  • 組合(Composite):Leaf(樹葉)、Composite(復合物,承載Leaf和Composite)、Component(Leaf和Composite的父類,使其一致)、Client,使容器與內容具有一致性,創(chuàng)造出遞歸結構。
  • 外觀(Facade):Facade(窗口,依賴其它角色)、被組裝的其它角色、Client,將復雜角色組裝成簡單窗口。
  • 享元(Flyweight):Flyweight、FlyweightFactory(聚合Flyweight,緩存Flyweight實現(xiàn)共享)、Client,共享內存,避免浪費。

行為型

  • 模板方法(Temple Method):AbstractClass、ConcreteClass(繼承AbstractClass),在父類定義處理流程的框架,在子類中實現(xiàn)具體處理。
  • 責任鏈(Chain Of Responsibility):Handler、ConcreteHandler、Chain(組裝Handler順序)、Client,責任節(jié)點各司其職。
  • 策略(Strategy):Strategy、ConcreteStrategy、Context(上下文,聚合Strategy),可靈活替換算法。
  • 狀態(tài)(State):State、ConcreteState、Context(上下文,聚合State),用類表示狀態(tài)。
  • 觀察者(Observer):Subject(觀察對象,聚合Observer)、ConcreteSubject、Observer、ConcreteObserver,Subject變更時通知Observer。
  • 訪問者(Visitor):Visitor、ConcreteVisitor、Element(元素)、ConcreteElement、ObjectStructure(對象結構,聚合Element),遍歷并處理對象結構數(shù)據(jù)。
  • 迭代器(Iterator):Iterator、ConcreteIterator、Aggregate、ConcreteAggregate(聚合具體迭代器),遍歷集合數(shù)據(jù)。
  • 命令(Command):Command、ConcreteCommand(聚合Receiver)、Receiver(接收者)、Client(請求者)、Invoker(發(fā)動者,聚合Command),保存命令歷史記錄和重復執(zhí)行命令。
  • 備忘錄(Memento):Originator(生成者)、Memento、Caretaker(負責人,聚合Memento),保存對象狀態(tài)。
  • 仲裁者(Mediator):Mediator、ConcreteMediator(聚合ConcreteColleague)、Colleague(組員,聚合Mediator)、ConcreteColleague,組員向仲裁者報告,仲裁者向組員下達指示。
  • 解釋器(Interpreter):AbstractExpression(抽象表達式)、TerminalExpression(終結符)、NonterminalExpression(非終結符,聚合AbstractExpression)、Context、Client,解析語法規(guī)則。

分布式設計原則

高可用
降級、限流(漏桶-平滑、令牌桶-可突發(fā)、環(huán)形隊列+滑動窗口)、切流、熔斷、回流、可回流、超時、隔離(線程、讀寫、資源、熱點、爬蟲)、負載均衡。

高并發(fā)
無狀態(tài)、拆分、服務化、隊列、數(shù)據(jù)異構(異構->原子化->聚合->緩存)、緩存、并發(fā)化(Future、Callback、Completable Future)、池化。

業(yè)務設計
防重、冪等、規(guī)則引擎、狀態(tài)機、審計、審批。

分布式理論
CAP:一致性、可用性、分區(qū)容錯性(三選二);
BASE:基本可用、軟狀態(tài)、最終一致性;
ACID:原子性、一致性、隔離性、持久性。

一致性原則
XA協(xié)議:準備 -> 提交(具有阻塞、協(xié)調者單點、腦裂等缺點);
XA三段協(xié)議:詢問 -> 準備 -> 提交;
TCC:try -> confirm / try -> cancel 鎖定 -> 確認/釋放;
最終一致性:查詢、補償、定期校對、可靠消息、緩存一致性。

超時處理
原則:誰超時誰處理,即接口調用超時,查詢+補償;接口調用成功后,接口內部服務超時須自己補償。

  • 兩狀態(tài)同步接口(OK/ERR):接口調用超時,調用方查詢+補償;接口內部服務超時,內部快速失敗+沖正;
  • 三狀態(tài)同步接口(OK/ING/ERR):接口調用超時,調用方查詢+補償;接口內部服務超時,返回處理中,內部查詢+補償?shù)匠晒Γ{用方輪詢;
  • 異步接口:接口調用超時,調用方查詢+補償;接口內部服務超時,內部查詢+補償?shù)匠晒?,回調通知;接口回調通知超時,指數(shù)補償回調;
  • 消息隊列:生產者發(fā)送超時,持久化可靠發(fā)送+冪等消費;消費者消費超時,消息處理完偏移量增加。

緩存
緩存分片:客戶端分片(redic)、代理分片、集群分片(一致性Hash);
緩存穿透:緩存空值、有效Key判斷;
緩存并發(fā):分布式鎖、本地鎖、軟過期(業(yè)務過期);
緩存雪崩:錯峰失效。

三、畫好架構圖

4+1視圖

場景視圖:參與者與功能用例關系,用例圖表示;
邏輯視圖:功能拆解后的組件邊界及關系,組件圖和類圖表示;
物理視圖:軟件與硬件映射關系,部署圖表示;
處理流程圖:各組件流程與數(shù)據(jù)交互,時序圖和流程圖表示;
開發(fā)視圖:模塊劃分及包組成,包圖表示。

C4視圖

語境圖:梳理待建設系統(tǒng)用戶和高層次依賴,在中間畫出自己的系統(tǒng),周圍是用戶與其它交互系統(tǒng)。


C4語境圖

容器圖:展開語境圖待建設系統(tǒng),用框圖表示,可包含名稱、技術選擇、職責、框圖間交互,明確外部系統(tǒng)邊界。


C4容器圖

組件圖:展開某個容器,描述其內部模塊組件組成、關系。


C4組件圖

類圖:同UML靜態(tài)圖,此處不再展開。

結束語

技術服務業(yè)務,如何在技術選型與實現(xiàn)上結合實際情況做最優(yōu)的取舍,才是每位工程師的價值所在。

參考資料

《億級流量網站架構核心技術》
《面向對象技術及UML教程》

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容