摘要
在互聯(lián)網(wǎng)系統(tǒng)架構(gòu)設(shè)計中,如何用最少的資源支撐起億級流量是每位工程師孜孜不息奮戰(zhàn)的目標(biāo)。雖然業(yè)務(wù)場景林林總總,但是萬變不離其宗。本文分享了一些系統(tǒng)設(shè)計理論與方法,也是這兩年多在工作中對系統(tǒng)設(shè)計的一些思考與總結(jié)。
一、善用UML工具
用例圖
用于需求分析階段,從用戶角度描述系統(tǒng)功能。

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

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

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

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

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

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

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

二、遵從設(shè)計原則
設(shè)計模式基礎(chǔ)
- 單一職責(zé):一個類只負(fù)責(zé)一個職能;
- 里氏轉(zhuǎn)換:在子類中不應(yīng)重寫、重載父類的方法,子類要能替代父類;
- 接口隔離:不依賴不需要的接口,拆分大接口;
- 迪米特法則:一個對象應(yīng)該對其他對象保持最少的了解(低耦合);
- 開放封閉:對擴展開放,對修改關(guān)閉;
- 依賴倒置:抽象不應(yīng)該依賴細(xì)節(jié),細(xì)節(jié)應(yīng)該依賴抽象,即針對接口編程,所有依賴關(guān)系都終止于抽象類或接口,不要對實現(xiàn)編程。
設(shè)計模式
創(chuàng)建型
- 工廠方法(Factory Method):Creator、Product、ConcreteCreator、ConcreteProduct,父類決定實例生成方式,由子類生成實例。
- 抽象工廠(Abstract Factory):AbstractFactory、ConcreteFactory、AbstractProduct、ConcreteProduct、Client,將零件組裝成復(fù)雜結(jié)構(gòu)的產(chǎn)品。
- 單例(Singleton):Singleton,只有一個實例。
- 建造者(Builder):Builder、ConcreteBuilder、Director(監(jiān)工,聚合Builder)、Client,分階段組裝生成復(fù)雜結(jié)構(gòu)的實例。
- 原型(Prototype):Prototype、ConcretePrototype、Client,通過clone生成實例。
結(jié)構(gòu)型
- 適配器(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,將類的功能層次結(jié)構(gòu)與實現(xiàn)層次結(jié)構(gòu)分離。
- 裝飾(Decorator):Component(被裝飾物)、ConcreteComponent、Decorator(裝飾物,繼承并聚合Component)、ConcreteDecorator,為Component添加Decorator,裝飾邊框與被裝飾物具有一致性。
- 組合(Composite):Leaf(樹葉)、Composite(復(fù)合物,承載Leaf和Composite)、Component(Leaf和Composite的父類,使其一致)、Client,使容器與內(nèi)容具有一致性,創(chuàng)造出遞歸結(jié)構(gòu)。
- 外觀(Facade):Facade(窗口,依賴其它角色)、被組裝的其它角色、Client,將復(fù)雜角色組裝成簡單窗口。
- 享元(Flyweight):Flyweight、FlyweightFactory(聚合Flyweight,緩存Flyweight實現(xiàn)共享)、Client,共享內(nèi)存,避免浪費。
行為型
- 模板方法(Temple Method):AbstractClass、ConcreteClass(繼承AbstractClass),在父類定義處理流程的框架,在子類中實現(xiàn)具體處理。
- 責(zé)任鏈(Chain Of Responsibility):Handler、ConcreteHandler、Chain(組裝Handler順序)、Client,責(zé)任節(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(對象結(jié)構(gòu),聚合Element),遍歷并處理對象結(jié)構(gòu)數(shù)據(jù)。
- 迭代器(Iterator):Iterator、ConcreteIterator、Aggregate、ConcreteAggregate(聚合具體迭代器),遍歷集合數(shù)據(jù)。
- 命令(Command):Command、ConcreteCommand(聚合Receiver)、Receiver(接收者)、Client(請求者)、Invoker(發(fā)動者,聚合Command),保存命令歷史記錄和重復(fù)執(zhí)行命令。
- 備忘錄(Memento):Originator(生成者)、Memento、Caretaker(負(fù)責(zé)人,聚合Memento),保存對象狀態(tài)。
- 仲裁者(Mediator):Mediator、ConcreteMediator(聚合ConcreteColleague)、Colleague(組員,聚合Mediator)、ConcreteColleague,組員向仲裁者報告,仲裁者向組員下達指示。
- 解釋器(Interpreter):AbstractExpression(抽象表達式)、TerminalExpression(終結(jié)符)、NonterminalExpression(非終結(jié)符,聚合AbstractExpression)、Context、Client,解析語法規(guī)則。
分布式設(shè)計原則
高可用
降級、限流(漏桶-平滑、令牌桶-可突發(fā)、環(huán)形隊列+滑動窗口)、切流、熔斷、回流、可回流、超時、隔離(線程、讀寫、資源、熱點、爬蟲)、負(fù)載均衡。
高并發(fā)
無狀態(tài)、拆分、服務(wù)化、隊列、數(shù)據(jù)異構(gòu)(異構(gòu)->原子化->聚合->緩存)、緩存、并發(fā)化(Future、Callback、Completable Future)、池化。
業(yè)務(wù)設(shè)計
防重、冪等、規(guī)則引擎、狀態(tài)機、審計、審批。
分布式理論
CAP:一致性、可用性、分區(qū)容錯性(三選二);
BASE:基本可用、軟狀態(tài)、最終一致性;
ACID:原子性、一致性、隔離性、持久性。
一致性原則
XA協(xié)議:準(zhǔn)備 -> 提交(具有阻塞、協(xié)調(diào)者單點、腦裂等缺點);
XA三段協(xié)議:詢問 -> 準(zhǔn)備 -> 提交;
TCC:try -> confirm / try -> cancel 鎖定 -> 確認(rèn)/釋放;
最終一致性:查詢、補償、定期校對、可靠消息、緩存一致性。
超時處理
原則:誰超時誰處理,即接口調(diào)用超時,查詢+補償;接口調(diào)用成功后,接口內(nèi)部服務(wù)超時須自己補償。
- 兩狀態(tài)同步接口(OK/ERR):接口調(diào)用超時,調(diào)用方查詢+補償;接口內(nèi)部服務(wù)超時,內(nèi)部快速失敗+沖正;
- 三狀態(tài)同步接口(OK/ING/ERR):接口調(diào)用超時,調(diào)用方查詢+補償;接口內(nèi)部服務(wù)超時,返回處理中,內(nèi)部查詢+補償?shù)匠晒?,調(diào)用方輪詢;
- 異步接口:接口調(diào)用超時,調(diào)用方查詢+補償;接口內(nèi)部服務(wù)超時,內(nèi)部查詢+補償?shù)匠晒Γ卣{(diào)通知;接口回調(diào)通知超時,指數(shù)補償回調(diào);
- 消息隊列:生產(chǎn)者發(fā)送超時,持久化可靠發(fā)送+冪等消費;消費者消費超時,消息處理完偏移量增加。
緩存
緩存分片:客戶端分片(redic)、代理分片、集群分片(一致性Hash);
緩存穿透:緩存空值、有效Key判斷;
緩存并發(fā):分布式鎖、本地鎖、軟過期(業(yè)務(wù)過期);
緩存雪崩:錯峰失效。
三、畫好架構(gòu)圖
4+1視圖
場景視圖:參與者與功能用例關(guān)系,用例圖表示;
邏輯視圖:功能拆解后的組件邊界及關(guān)系,組件圖和類圖表示;
物理視圖:軟件與硬件映射關(guān)系,部署圖表示;
處理流程圖:各組件流程與數(shù)據(jù)交互,時序圖和流程圖表示;
開發(fā)視圖:模塊劃分及包組成,包圖表示。
C4視圖
語境圖:梳理待建設(shè)系統(tǒng)用戶和高層次依賴,在中間畫出自己的系統(tǒng),周圍是用戶與其它交互系統(tǒng)。

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

組件圖:展開某個容器,描述其內(nèi)部模塊組件組成、關(guān)系。

類圖:同UML靜態(tài)圖,此處不再展開。
結(jié)束語
技術(shù)服務(wù)業(yè)務(wù),如何在技術(shù)選型與實現(xiàn)上結(jié)合實際情況做最優(yōu)的取舍,才是每位工程師的價值所在。
參考資料
《億級流量網(wǎng)站架構(gòu)核心技術(shù)》
《面向?qū)ο蠹夹g(shù)及UML教程》