云原生時(shí)代,分布式系統(tǒng)設(shè)計(jì)必備知識(shí)圖譜(內(nèi)含22個(gè)知識(shí)點(diǎn))

點(diǎn)擊上方藍(lán)字關(guān)注我們

作者| 楊澤強(qiáng)(竹澗)阿里云技術(shù)專家
我們身處于一個(gè)充斥著分布式系統(tǒng)解決方案的計(jì)算機(jī)時(shí)代,無論是支付寶、微信這樣頂級(jí)流量產(chǎn)品、還是區(qū)塊鏈、IOT 等熱門概念、抑或如火如荼的容器生態(tài)技術(shù)如 Kubernetes、Serverless,其背后的技術(shù)架構(gòu)核心都離不開分布式系統(tǒng)。
為什么要懂分布式架構(gòu)設(shè)計(jì)
分布式系統(tǒng)大圖

設(shè)計(jì)
網(wǎng)關(guān)模式,Gateway
功能
請(qǐng)求路由,客戶端直接調(diào)用 Gateway,Gateway 負(fù)責(zé)路由轉(zhuǎn)發(fā)到注冊(cè)服務(wù)上 服務(wù)注冊(cè),后端服務(wù)將 API 注冊(cè),Gateway 負(fù)責(zé)路由 負(fù)載均衡,支持多種負(fù)載策略
round robin 隨機(jī)均衡算法 多權(quán)重負(fù)載 session 粘連 其它
安全特性,支持 HTTPS,賬戶鑒權(quán),及其它安全特性支持 灰度發(fā)布,可以針對(duì)服務(wù)版本或者租戶等特性做灰度發(fā)布 API 聚合,將多個(gè)后端接口聚合,減少客戶端調(diào)用次數(shù) API 編排,通過編排來串接多個(gè) API 完成特定業(yè)務(wù)
設(shè)計(jì)要點(diǎn)
可用性,必須保證高可用 擴(kuò)展性,可以靈活擴(kuò)展以支持特定業(yè)務(wù)比如特定業(yè)務(wù)流控 高性能,通常使用異步 IO 模型框架實(shí)現(xiàn),比如 Java netty,Go Channel 安全,如加密通信,鑒權(quán),DDOS 防御等 運(yùn)維
應(yīng)用監(jiān)控,包括容量,性能,異常檢測(cè)等 彈性伸縮,具備高彈性能力,以低成本應(yīng)對(duì)高峰值
架構(gòu)
與業(yè)務(wù)解耦合,提供擴(kuò)展擴(kuò)展機(jī)制比如 Plugin,Serverless 的思路支持后端業(yè)務(wù) 服務(wù)隔離,可以按照后端服務(wù)劃分網(wǎng)關(guān),做到不同服務(wù)使用不同網(wǎng)關(guān) 網(wǎng)關(guān)部署靠近后端,保證網(wǎng)絡(luò)損耗最小,性能最佳
邊車模式,Sidecar
價(jià)值
分離控制與邏輯,分離業(yè)務(wù)邏輯與路由,流控,熔斷,冪等,服務(wù)發(fā)現(xiàn),鑒權(quán)等控制組件 適用場(chǎng)景
老系統(tǒng)改造擴(kuò)展,Sidebar 進(jìn)程與服務(wù)進(jìn)程部署在同一個(gè)節(jié)點(diǎn),通過網(wǎng)絡(luò)協(xié)議通訊 多語言混合分布式系統(tǒng)擴(kuò)展 應(yīng)用程序由多方提供
設(shè)計(jì)要點(diǎn)
標(biāo)準(zhǔn)服務(wù)協(xié)議,Sidebar 到 Service,Sidebar 到 Sidebar 協(xié)議盡可能與語言解耦 聚合控制邏輯比如流控,熔斷,冪等,重試,減少業(yè)務(wù)邏輯 不要使用對(duì)服務(wù)侵入的方式進(jìn)行進(jìn)程間通訊如信號(hào)量,共享內(nèi)存,優(yōu)先使用本地網(wǎng)絡(luò)通訊的方式比如 TPCP 或者 HTTP
服務(wù)網(wǎng)格,Service Mesh

特點(diǎn)
應(yīng)用間通訊中間層 輕量級(jí)網(wǎng)絡(luò)代理 解耦應(yīng)用程序 應(yīng)用程序無感知
主流框架
Istio Linkerd
分布式鎖
解決方案
Redis 分布式鎖,SETNX key value PX expiretime
value 生成,最好全局唯一比如 TraceID,可以使用 /dev/urandom 生成 expiretime 單位是毫秒,過期鎖自動(dòng)釋放 ,鎖持有者保證過期時(shí)間內(nèi)爭(zhēng)搶資源完成計(jì)算
悲觀鎖,先獲取鎖,再進(jìn)行操作,吞吐量底 樂觀鎖,使用版本號(hào)方式實(shí)現(xiàn),吞吐量高,可能出現(xiàn)鎖異常,適用于多讀情況 CAS,修改共享數(shù)據(jù)源的場(chǎng)景可以代替分布式鎖
排他性,任意條件只有一個(gè) client 可以獲取鎖 鎖有自動(dòng)釋放方式,比如超時(shí)釋放 鎖必須高可用,且持久化 鎖必須非阻塞且可重入 避免死鎖,client最終一定可以獲取鎖,不存在異常情況鎖無法釋放的情況 集群容錯(cuò)性,集群部分機(jī)器故障,鎖操作仍然可用
配置中心
靜態(tài)配置,環(huán)境及軟件啟動(dòng)配置 動(dòng)態(tài)配置,運(yùn)行時(shí)動(dòng)態(tài)調(diào)整的配置如流控開關(guān),熔斷開關(guān)等
異步通訊
請(qǐng)求響應(yīng)式,發(fā)送方直接向接收方發(fā)送請(qǐng)求
發(fā)送方主動(dòng)輪詢 發(fā)送方注冊(cè)一個(gè)回調(diào)函數(shù),接收方處理完成后回調(diào)發(fā)送方
事件驅(qū)動(dòng)設(shè)計(jì)(EDA)
消息訂閱,發(fā)送方發(fā)布消息,接收方訂閱并消費(fèi)消息 Broker 中間人,發(fā)送方向 Broker 發(fā)布消息,接收方向 Broker 訂閱消息,彼此解耦,比如中間件 RocketMQ 事情驅(qū)動(dòng)設(shè)計(jì)優(yōu)勢(shì) 服務(wù)間依賴解除 服務(wù)隔離程度高
冪等性
本質(zhì)是一個(gè)操作,無論執(zhí)行多少次,執(zhí)行結(jié)果總是一致的 冪等核心是全局唯一 ID,鏈路依據(jù)全局 ID 做冪等,依據(jù)業(yè)務(wù)復(fù)雜度可以選取多種實(shí)現(xiàn)方式
數(shù)據(jù)庫自增長(zhǎng) ID 本地生成 uuid Redis 生產(chǎn) id Twitter 開源算法 Snowflake
HTTP 冪等性,除 POST 外,HEAD,GET,OPTIONS,DELETE,PUT 均滿足冪等
性能
分布式緩存
Cache Aside,常用模式,應(yīng)用要維護(hù)緩存的失效,命中,更新等動(dòng)作
Read/Write Through,緩存代理更新數(shù)據(jù)庫操作,應(yīng)用視角只有一份存儲(chǔ)
Write Behind Cache,IO 加速方式之一,更新操作只在內(nèi)測(cè)完成,異步進(jìn)行批量更新數(shù)據(jù)庫
異步處理
Push 模型,中心調(diào)度,復(fù)雜度高 Pull 模型,無中心調(diào)度,復(fù)雜度底 Push+Pull 模型
數(shù)據(jù)庫擴(kuò)展
垂直分片
字段拆分,將變化頻率不同的字段拆分到不同表
水平分片
哈希算法來分,數(shù)據(jù)離散度高,降低熱點(diǎn)可能性
通過時(shí)間范圍分片,保證數(shù)據(jù)連續(xù)性
分片設(shè)計(jì)要點(diǎn)
分片要預(yù)留足夠空間,避免重新分片
分片聚合要并行去做
業(yè)務(wù)盡可能不去做跨分片的事務(wù)
容錯(cuò)
系統(tǒng)可用性
MTTF, Mean Time To Failure,系統(tǒng)平均運(yùn)行多長(zhǎng)時(shí)間才發(fā)生故障,越長(zhǎng)越好 MTTR,Mean Time To Recover, 故障平均修復(fù)時(shí)間,越短越好 可用性計(jì)算公式, Availability= MTTF /(MTTF+MTTR)
服務(wù)降級(jí)
降低一致性
強(qiáng)一致性,將所有的同步一致性,切換為最終一致性,提高吞吐量 弱一致性,必要時(shí)候犧牲一致性換取服務(wù)整體可靠性
關(guān)閉次要服務(wù)
不同應(yīng)用,關(guān)閉次要應(yīng)用,釋放物理資源 相同應(yīng)用,關(guān)閉應(yīng)用次要功能,更多資源給到核心功能
簡(jiǎn)化服務(wù)功能
如簡(jiǎn)化業(yè)務(wù)流程,減少通訊數(shù)據(jù)等
服務(wù)限流
SLA 保證方式之一 應(yīng)對(duì)突發(fā)峰刺流量,一定程度節(jié)約容量規(guī)劃成本 租戶隔離策略之一,避免某些用戶占用其它用戶的資源,導(dǎo)致服務(wù)大范圍不可用
服務(wù)降級(jí) 服務(wù)拒絕
服務(wù)權(quán)重劃分,多租戶環(huán)境將資源按權(quán)重劃分,保證重要客戶的資源 服務(wù)延時(shí)處理,加入服務(wù)緩沖隊(duì)列延緩服務(wù)壓力,用于削峰 服務(wù)彈性伸縮,依賴服務(wù)監(jiān)控,彈性伸縮容
計(jì)數(shù)器
單機(jī)或者集群保存某用戶某時(shí)間段請(qǐng)求數(shù),達(dá)到閾值則觸發(fā)流控
隊(duì)列算法
FIFO 隊(duì)列 請(qǐng)求速度波動(dòng),消費(fèi)速度均勻,隊(duì)列滿則流控 權(quán)重隊(duì)列 按服務(wù)劃分優(yōu)先級(jí)隊(duì)列,不同隊(duì)列權(quán)重不同 隊(duì)列算法設(shè)計(jì)關(guān)鍵:隊(duì)列長(zhǎng)度的預(yù)設(shè)非常關(guān)鍵 隊(duì)列太長(zhǎng),流控未生效,服務(wù)已經(jīng)被打死 隊(duì)列太短,流控被頻繁觸發(fā),體驗(yàn)差
漏斗算法
本質(zhì)上是隊(duì)列+限流器實(shí)現(xiàn),限流器保證消費(fèi)速度均勻類 TCP sync backlog 轉(zhuǎn)發(fā)速度均勻
令牌桶
中間人已恒定速率向桶里發(fā)放令牌,服務(wù)請(qǐng)求拿到 token 則開始服務(wù),否則不處理 轉(zhuǎn)發(fā)速度不均勻,流量小時(shí)積累,流量大時(shí)消費(fèi)
動(dòng)態(tài)流控
實(shí)時(shí)計(jì)算服務(wù)能力如 QPS,對(duì)比服務(wù) RT 如果 RT 過大,則減少 QPS
手動(dòng)開關(guān),主動(dòng)運(yùn)維和應(yīng)急使用 監(jiān)控通知,限流發(fā)生時(shí)干系人要清楚 用戶感知,如返回特定錯(cuò)誤信息(錯(cuò)誤code/錯(cuò)誤提示) 鏈路標(biāo)識(shí),RPC鏈路加入限流標(biāo)識(shí)方便上下游業(yè)務(wù)識(shí)別限流場(chǎng)景做不同處理
熔斷設(shè)計(jì)
過載保護(hù),系統(tǒng)負(fù)載過高情況為防止故障產(chǎn)生,而采取的一種保護(hù)措施 防止應(yīng)用程序不斷嘗試可能會(huì)失敗的操作
Closed,閉合狀態(tài),正常狀態(tài),系統(tǒng)需要一個(gè)基于時(shí)間線到錯(cuò)誤計(jì)數(shù)器,如果錯(cuò)誤累計(jì)達(dá)到閾值則切換至 Open 狀態(tài) Open,斷開狀態(tài),所有對(duì)服務(wù)對(duì)請(qǐng)求立即返回錯(cuò)誤,不用調(diào)用后端服務(wù)進(jìn)行計(jì)算 Half-Open,半開狀態(tài),允許部分請(qǐng)求流量進(jìn)入并處理,如果請(qǐng)求成功則按照某種策略切換到 Closed 狀態(tài)
定義觸發(fā)熔斷的錯(cuò)誤類型 所有觸發(fā)熔斷的錯(cuò)誤請(qǐng)求必須要有統(tǒng)一的日志輸出 熔斷機(jī)制必須有服務(wù)診斷及自動(dòng)恢復(fù)能力 最好為熔斷機(jī)制設(shè)置手動(dòng)開關(guān)用于三種狀態(tài)的切換 熔斷要切分業(yè)務(wù),做到業(yè)務(wù)隔離熔斷
補(bǔ)償事務(wù)
CAP
一致性 (Consistence)、可用性 (Availability)、分區(qū)容忍性 (Partition Tolerance)
BASE
Basic Availabillity,基本可用 Soft State,軟狀態(tài) Eventual Consistency,最終一致性
Design For Failure Exponential Blackoff,指數(shù)級(jí)退避
DevOps
部署
云
公有云 私有云 混合云
容器技術(shù)
Docker Kubernetes
停機(jī)部署 滾動(dòng)部署 藍(lán)綠部署 灰度部署 A/B 測(cè)試
配置管理
Ansible Puppet Shippable
監(jiān)控
Nagios DynaTrace
CI 與 CD
工程效率
敏捷管理
Scrum
持續(xù)集成
Jenkins CodeShip
持續(xù)交付
總結(jié)及學(xué)習(xí)建議
分布式系統(tǒng)在阿里巴巴經(jīng)濟(jì)體有著廣泛的應(yīng)用,以筆者所在的彈性計(jì)算技術(shù)團(tuán)隊(duì)為例,當(dāng)業(yè)務(wù)足夠規(guī)?;螅?strong>最終面臨的技術(shù)問題都是通過踐行分布式系統(tǒng)架構(gòu)的設(shè)計(jì)理念和方法論得以解決,可以說分布式系統(tǒng)架構(gòu)的知識(shí)與方法論是當(dāng)前互聯(lián)網(wǎng)應(yīng)用規(guī)?;蟮耐ㄓ媒鉀Q方案。
學(xué)習(xí)分布式系統(tǒng)設(shè)計(jì)也不是一蹴而就,需要不斷汲取理論知識(shí),然后將理論不斷付諸實(shí)踐,最終通過一次次的調(diào)優(yōu)來將知識(shí)的價(jià)值最大化。
筆者最后的建議是先理論、后實(shí)踐、重實(shí)踐、不妥協(xié),所謂紙上得來終覺淺,絕知此事要躬行,與君共勉。
END

獎(jiǎng)勵(lì)看到最后的你
:
# 點(diǎn)個(gè)在看,并在下方留言互動(dòng)
# 然后,將截圖發(fā)送至后臺(tái),試試手氣?
# 本周互動(dòng)獎(jiǎng)品是“阿里云定制數(shù)據(jù)線”
# 本期禮品開獎(jiǎng)時(shí)間1月25日?
