什么樣的系統(tǒng)是數(shù)據(jù)密集型系統(tǒng)?
對(duì)于數(shù)據(jù)密集型系統(tǒng)而言,CPU的處理能力不是第一限制因素,關(guān)鍵是數(shù)據(jù)量,數(shù)據(jù)的復(fù)雜度和數(shù)據(jù)的快速多變性.一般包括如下模塊:
- 數(shù)據(jù)庫:持久化保存數(shù)據(jù).
- 高速緩存:緩存復(fù)雜的或者計(jì)算代價(jià)高昂的數(shù)據(jù)
- 索引:支持?jǐn)?shù)據(jù)篩選,過濾等
- 流式處理:持續(xù)發(fā)送消息給其他進(jìn)程,異步處理.
- 批處理:定時(shí)處理大量數(shù)據(jù)的任務(wù).
數(shù)據(jù)密集型系統(tǒng)的目標(biāo)
可靠性
可以容忍一定的錯(cuò)誤,保持服務(wù)可以正常運(yùn)行.
可以容忍的錯(cuò)誤一般包括:
- 硬件故障
可以通過硬件冗余配置的方式來降低系統(tǒng)的故障率.
近期云計(jì)算的發(fā)展,我們也可以通過軟件容錯(cuò)的方式來降低系統(tǒng)故障率. - 軟件錯(cuò)誤
一般任務(wù)硬件故障是相互獨(dú)立的,但是軟件錯(cuò)誤往往是相互關(guān)聯(lián)的.例如:
- 由于軟件錯(cuò)誤,當(dāng)輸入某些特定值時(shí)導(dǎo)致服務(wù)崩潰
- 應(yīng)用服務(wù)使用的共享資源失控.
- 依賴的服務(wù),突然延遲增加或者不可用.
- 級(jí)聯(lián)故障,由于一個(gè)組件的故障導(dǎo)致故障傳遞引發(fā)更大的故障.
我們?cè)O(shè)計(jì)的軟件一般會(huì)對(duì)運(yùn)行的環(huán)境進(jìn)行一些假設(shè),但是一旦環(huán)境發(fā)生變化導(dǎo)致這些假設(shè)不是都成立就會(huì)導(dǎo)致問題.
- 人為失誤
人為的操作失誤和配置失誤.如果假設(shè)人的操作是不可靠的,我們可以采用下面的方式維持系統(tǒng)的可靠性:
- 以最小出錯(cuò)的方式設(shè)計(jì)系統(tǒng).降低使用成本.
- 分離最容易出錯(cuò)的地方,容易引發(fā)錯(cuò)誤的接口.
- 充分的測(cè)試.
- 當(dāng)出現(xiàn)人為失誤的時(shí)候支持快速恢復(fù).
- 設(shè)置詳細(xì)的監(jiān)控和告警.
- 加強(qiáng)流程.
可擴(kuò)展性
可擴(kuò)展性描述的是如果負(fù)載增加的話,我們的服務(wù)能否正常的運(yùn)行.我們?cè)诳紤]可擴(kuò)展性的時(shí)候一般需要思考:如果系統(tǒng)以某種方式增長,我們應(yīng)對(duì)措施有哪些.我們應(yīng)該如何添加資源以處理增加的負(fù)載.
描述負(fù)載
負(fù)載可以用若干負(fù)載參數(shù)描述.參數(shù)選擇一般可能有:每秒請(qǐng)求處理次數(shù)、數(shù)據(jù)庫中寫入的比例、聊天室同時(shí)活動(dòng)的用戶數(shù)量、緩存命中率等.
我們既要關(guān)心平均值,同時(shí)也要關(guān)心峰值帶來的影響.描述性能
在負(fù)載增加的情況下我們一般需要思考兩個(gè)問題:
- 負(fù)載增加,在系統(tǒng)資源不變的情況下,服務(wù)的性能會(huì)有什么變化.
- 負(fù)載增加,如果要保持性能不變,我們需要增加哪些資源,增加多少.
為了解決性能的描述,我們需要一種量化的指標(biāo).
例如針對(duì)請(qǐng)求響應(yīng)時(shí)間,我們可以根據(jù)請(qǐng)求的處理時(shí)間不同,生成一個(gè)數(shù)值分布圖.
一般描述性能時(shí)我們采用百分位數(shù)這個(gè)指標(biāo).例如中位數(shù)就是一個(gè)這樣的數(shù):他表示有一半的請(qǐng)求處理時(shí)間低于這個(gè)數(shù)值,有一半的請(qǐng)求處理時(shí)間高于這個(gè)值.同樣的我們可以使用p99來表示有99%的請(qǐng)求處理時(shí)間低于這個(gè)值,有1%的請(qǐng)求處理時(shí)間高于這個(gè)值.
對(duì)于這個(gè)量化的指標(biāo),排隊(duì)延遲有著很大的影響,越高的百分位數(shù)(p50,p99)影響越大.對(duì)于一些處理很慢的請(qǐng)求,如果他后面有很多簡單的請(qǐng)求也會(huì)導(dǎo)致后面的請(qǐng)求被阻塞,直到他們消耗完.
對(duì)于一個(gè)請(qǐng)求需要并行的請(qǐng)求很多個(gè)其他服務(wù)才能處理完成的場景中,耗時(shí)最長的那個(gè)子請(qǐng)求將拖累整個(gè)系統(tǒng),這種現(xiàn)象被稱為:長尾效應(yīng).
- 應(yīng)對(duì)策略
針對(duì)負(fù)載的增加,我們一般采用垂直和水平擴(kuò)展兩種方案.
一般對(duì)無狀態(tài)的服務(wù)進(jìn)行水平擴(kuò)展,因?yàn)楸容^簡單.
對(duì)有狀態(tài)的例如數(shù)據(jù)存儲(chǔ),一般先采用垂直擴(kuò)展的方式,直到不能滿足需求在進(jìn)行水平擴(kuò)展.
后續(xù)將詳細(xì)討論如何進(jìn)行通用模塊的可擴(kuò)展架構(gòu).
可維護(hù)性
可維護(hù)性主要關(guān)注三個(gè)方面:
- 可運(yùn)維:方便運(yùn)營人員保持系統(tǒng)平穩(wěn)運(yùn)行.
- 簡單性:簡化系統(tǒng)的復(fù)雜性.通過抽象等方式來實(shí)現(xiàn).
- 可演化: 后續(xù)工程師可以輕松的對(duì)系統(tǒng)進(jìn)行改造.
- 簡單性:簡化復(fù)雜度
復(fù)雜性的表現(xiàn)形式多種多樣:狀態(tài)空間膨脹,模塊耦合度高、相互依賴關(guān)系,不一致的命名和術(shù)語、為了性能采用的特殊處理、為了特定問題引入的特殊框架等.
總結(jié)下來就是:復(fù)雜性來源于實(shí)現(xiàn).
所以后續(xù)將討論如何做好抽象.