《架構(gòu)即未來(lái)》和《架構(gòu)真經(jīng)》是架構(gòu)姊妹篇,本來(lái)想兩本都買(mǎi)來(lái)學(xué)習(xí),但是《架構(gòu)即未來(lái)》看了一下目錄贮尖,感覺(jué)偏“道”一些,理解和應(yīng)用有些難度趁怔,沒(méi)有《架構(gòu)真經(jīng)》的實(shí)戰(zhàn)性這么強(qiáng)湿硝。以下內(nèi)容是基于《架構(gòu)真經(jīng)》中的一些架構(gòu)原則做了整理薪前,方便閱讀。
1.數(shù)據(jù)庫(kù)
1.1.評(píng)估規(guī)則
- 數(shù)據(jù)量关斜、存儲(chǔ)量
- 響應(yīng)時(shí)間長(zhǎng)短
- 關(guān)系
1.2.關(guān)注明鎖和監(jiān)控暗鎖
最大化數(shù)據(jù)庫(kù)并發(fā)和吞吐量
1.3.禁用分階段提交事務(wù)
容易阻塞其它事務(wù)
1.4.永遠(yuǎn)不要為確認(rèn)操作是否有效而讀取剛剛寫(xiě)入的數(shù)據(jù)
1.5.nosql
- no select for update
- no select *
2.緩存設(shè)計(jì)
2.1.利用CDN緩存
- 加快訪問(wèn)速度
- 動(dòng)靜分離
2.2.httpheader
max-age
Expires
cache-control
Last-Modified
ETags
2.3.應(yīng)用緩存
緩存命中率>85%
3.分布式系統(tǒng)設(shè)計(jì)
3.1.CAP要求不能同時(shí)滿足
- 一致性C
從客戶角度看示括,一組操作同時(shí)發(fā)生 - 可用性A
每個(gè)操作必須都能收到預(yù)期的響應(yīng) - 分區(qū)容錯(cuò)性P
即使個(gè)別消息丟失,操作仍然可以完成 - 解決
[BASE思想]
o o 基本可用BA
o o 軟狀態(tài)S
o o 最終一致E
[放寬時(shí)間約束]
o o 放寬一致性可以使我們?cè)诮鉀Q擴(kuò)展問(wèn)題時(shí)有更大的靈活性
- 無(wú)狀態(tài)實(shí)施方案
4.方案設(shè)計(jì)
4.1.采用帕累托原則簡(jiǎn)化范圍
80-20原則痢畜,收益的80%來(lái)自于20%的工作
4.2.考慮成本優(yōu)化和可擴(kuò)展性簡(jiǎn)化設(shè)計(jì)
4.2.1.擴(kuò)展性設(shè)計(jì)
DID方法
- Implement(I) 實(shí)施3倍的容量
- Design(D) 設(shè)計(jì)20倍的容量
- Deploy(D) 部署1.5倍的容量
4.3.依靠其他人的經(jīng)驗(yàn)來(lái)簡(jiǎn)化部署
5.拆分和擴(kuò)展
5.1.水平擴(kuò)展(X軸)
5.1.1.復(fù)制服務(wù)或者數(shù)據(jù)庫(kù)分散事務(wù)處理負(fù)載
- 數(shù)據(jù)庫(kù)讀寫(xiě)分離
- 多部署服務(wù)實(shí)例
5.1.2.事務(wù)的ACID屬性
- 原子性Atomicity
- 一致性Consistency
- 隔離性Isolation
- 持久性Durability
5.2.拆分(Y軸)
5.2.1.垂直拆分垛膝,面向數(shù)據(jù)或者服務(wù)
服務(wù)拆分,例如拆分會(huì)員丁稀、商品吼拥、積分等
5.3.拆分(Z軸)
5.3.1.分片,把數(shù)據(jù)或者服務(wù)分割成幾塊
- 例如擴(kuò)大客戶基數(shù)线衫,按照用戶ID取脑淇桑或者散列算法分片
- 數(shù)據(jù)分片,理論上可以無(wú)限擴(kuò)存儲(chǔ)
6.避免工具被過(guò)度使用
- 缺乏實(shí)驗(yàn)和使用新技術(shù)的勇氣授账,結(jié)果導(dǎo)致工具被鎖定和過(guò)渡使用
- 我們都試圖使用熟悉的工具解決問(wèn)題矿酵,類(lèi)似技能的人員解決仍然會(huì)得到一致的答案,過(guò)度
1)需要拿出一部分資源主動(dòng)分析、試驗(yàn)和采用新工具
2)花時(shí)間學(xué)習(xí)新事物,保持開(kāi)放心態(tài)
7.避免過(guò)度設(shè)計(jì)
7.1.通過(guò)測(cè)試人員是否能夠輕松的理解解決方案來(lái)驗(yàn)證
7.2.過(guò)度設(shè)計(jì)分類(lèi)
- 產(chǎn)品的設(shè)計(jì)和實(shí)施超過(guò)實(shí)際的需求
- 把事情做得過(guò)于復(fù)雜和以復(fù)雜的方式去實(shí)現(xiàn)
7.3.好工程師的度量
多快簡(jiǎn)化一個(gè)復(fù)雜的問(wèn)題塞蹭,然后構(gòu)思出一個(gè)易于理解并可以維護(hù)的解決方案
8.流量風(fēng)險(xiǎn)
- 空前極具增長(zhǎng)的大量用戶請(qǐng)求
- 用戶行為都集中在少數(shù)熱點(diǎn)上
9.發(fā)現(xiàn)問(wèn)題
9.1.從失敗而不是成功中能學(xué)習(xí)到更多的東西
若隱藏失敗,結(jié)果必然是反復(fù)失敗
9.2.觀察客戶或用A/B Test驗(yàn)證
9.3.QA的作用以較低成本發(fā)現(xiàn)問(wèn)題
- 提升工程速度和增加缺陷檢出率
- QA不提升質(zhì)量
代碼評(píng)審和測(cè)試驅(qū)動(dòng)開(kāi)發(fā)(TDD辜腺,提前編寫(xiě)測(cè)試代碼)可以提升質(zhì)量
9.4.代碼支持回滾能力
大部分回滾問(wèn)題出現(xiàn)在數(shù)據(jù)庫(kù)
- 數(shù)據(jù)庫(kù)結(jié)構(gòu)的變更僅可以增加,而不應(yīng)該刪除列或者表
9.5.測(cè)試
- 單元測(cè)試
- 系統(tǒng)測(cè)試
- 回歸測(cè)試
最終實(shí)現(xiàn)完全自動(dòng)化
10.故障
10.1.設(shè)立故障隔離域建立“泳道”
不允許跨越泳道邊界進(jìn)行同步調(diào)用
- 例如支付網(wǎng)關(guān)乍恐,每個(gè)客戶獨(dú)立網(wǎng)關(guān)泳道
沿物理服務(wù)器邊界劃分泳道
10.2.消除單點(diǎn)故障(SPOF)
10.3.避免系統(tǒng)串聯(lián)
- 串聯(lián)電路和并聯(lián)電路的優(yōu)劣勢(shì)
- 減少串聯(lián)組件或增加并聯(lián)組件降低故障風(fēng)險(xiǎn)
10.4.增加上下線開(kāi)關(guān)
11.監(jiān)控
11.1.監(jiān)控目的
1)有問(wèn)題嗎评疗?
2)問(wèn)題在哪里?
3)有什么問(wèn)題茵烈?
11.2.監(jiān)控內(nèi)容
- 應(yīng)用監(jiān)控
告警無(wú)法確定對(duì)于客戶的實(shí)際影響 - 業(yè)務(wù)監(jiān)控
- 硬件監(jiān)控
11.3.監(jiān)控預(yù)測(cè)問(wèn)題是否可能發(fā)生
- 控制圖的統(tǒng)計(jì)工具
- 神經(jīng)元網(wǎng)絡(luò)或貝葉斯網(wǎng)絡(luò)這樣的機(jī)器學(xué)習(xí)算法
11.4.日志
11.4.1.使用自動(dòng)化的工具監(jiān)控日志
- ELK
- 檢索目標(biāo)行百匆、統(tǒng)計(jì)錯(cuò)誤
- 超過(guò)預(yù)警閾值告警
11.4.2.日志是監(jiān)控、事件管理呜投、應(yīng)用調(diào)試的重要工具
12.數(shù)據(jù)中心
12.1.系統(tǒng)部署3個(gè)或更多活的數(shù)據(jù)中心
12.2.使用云平臺(tái)來(lái)解決突發(fā)增長(zhǎng)
- 雙活遷移三活數(shù)據(jù)中心加匈,云可做第三數(shù)據(jù)中心
- 批量處理、測(cè)試環(huán)境仑荐、或者峰值容量雕拼,可以考慮放云環(huán)境
12.3.分析
- 歸納
是從數(shù)據(jù)中形成假設(shè)的過(guò)程 - 演繹
是對(duì)數(shù)據(jù)進(jìn)行假設(shè)檢驗(yàn)以確定有效性的過(guò)程
12.4.數(shù)據(jù)梯級(jí)存儲(chǔ)策略
12.4.1.RFM方案
- Recency數(shù)據(jù)多久前被訪問(wèn)過(guò)
近因 - Frequency數(shù)據(jù)多久被訪問(wèn)一次,即數(shù)據(jù)訪問(wèn)頻率
頻率 - Monetization特定數(shù)據(jù)對(duì)業(yè)務(wù)的價(jià)值
貨幣化分析
12.4.2.存儲(chǔ)數(shù)據(jù)無(wú)價(jià)值
- 不被訪問(wèn)的時(shí)間越久
- 訪問(wèn)的頻率越低
- 數(shù)據(jù)對(duì)業(yè)務(wù)價(jià)值越低
13.風(fēng)險(xiǎn)評(píng)估模型
13.1.風(fēng)險(xiǎn)=問(wèn)題發(fā)生的概率*發(fā)生的影響
13.2.發(fā)生的影響
13.2.1.服務(wù)不可用時(shí)間/數(shù)據(jù)損失百分比/受影響的響應(yīng)時(shí)間
13.2.2.影響的百分比
- 影響客戶的百分比
- 受影響功能的百分比
14.瀏覽器訪問(wèn)
14.1.減少域名解析
- 瀏覽器對(duì)每個(gè)服務(wù)器或者網(wǎng)關(guān)代理的最大持久并發(fā)連接數(shù)有限制
不要把所有對(duì)象放在同一個(gè)域里
14.2.減少頁(yè)面元素
- 瀏覽器允許每個(gè)子域名擁有自己的最大并發(fā)連接數(shù)
- 通過(guò)添加域名最大化并發(fā)連接數(shù)量
- gzip壓縮
14.3.重定向
- 重定向使用服務(wù)器配置實(shí)現(xiàn)粘招,避免代碼的解決方案
- 重定向不利于搜索引擎收錄
- http狀態(tài)碼301/302
14.4.使用cookie保存會(huì)話數(shù)據(jù)
- cookie越大啥寇,頁(yè)面加載速度越慢
- 使用https發(fā)送cookie
15.硬件網(wǎng)絡(luò)
15.1.采購(gòu)
- 盡可能采用小型廉價(jià)的硬件
處理器最多最大的設(shè)備往往是利潤(rùn)最高
15.2.防火墻
- 不要用在低價(jià)值的靜態(tài)內(nèi)容防護(hù)上
- 防火墻失敗是僅次于數(shù)據(jù)庫(kù)的第二大網(wǎng)站癱瘓黑手
16.異步通信
16.1.非關(guān)鍵請(qǐng)求
- 請(qǐng)求以非阻塞方式發(fā)出,而且調(diào)用方不阻止等待響應(yīng)
與MQ交互調(diào)用注意異步
16.2.使用原則
- 外部API/第三方調(diào)用
- 長(zhǎng)期運(yùn)行的進(jìn)程
進(jìn)程長(zhǎng)時(shí)間運(yùn)行容易緩慢 - 經(jīng)常改變且易出錯(cuò)/過(guò)于復(fù)雜的方法
避免將關(guān)鍵代碼與復(fù)雜而且經(jīng)常改變的代碼捆綁在一起 - 時(shí)間約束
兩個(gè)進(jìn)程之間不存在時(shí)間約束,列如注冊(cè)成功和發(fā)送郵件辑甜,不能耽誤注冊(cè)頁(yè)面結(jié)果反饋給用戶
16.3.同步調(diào)用方式必須設(shè)置超時(shí)
PS:歡迎加個(gè)人微信交流 @jinleivinus 衰絮,也可以掃描以下二維碼,轉(zhuǎn)載請(qǐng)注明出處磷醋。