可靠,可擴(kuò)展,可維護(hù)的應(yīng)用系統(tǒng)

什么樣的系統(tǒng)是數(shù)據(jù)密集型系統(tǒng)?

對(duì)于數(shù)據(jù)密集型系統(tǒng)而言,CPU的處理能力不是第一限制因素,關(guān)鍵是數(shù)據(jù)量,數(shù)據(jù)的復(fù)雜度和數(shù)據(jù)的快速多變性.一般包括如下模塊:

  1. 數(shù)據(jù)庫:持久化保存數(shù)據(jù).
  2. 高速緩存:緩存復(fù)雜的或者計(jì)算代價(jià)高昂的數(shù)據(jù)
  3. 索引:支持?jǐn)?shù)據(jù)篩選,過濾等
  4. 流式處理:持續(xù)發(fā)送消息給其他進(jìn)程,異步處理.
  5. 批處理:定時(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)的.例如:
  1. 由于軟件錯(cuò)誤,當(dāng)輸入某些特定值時(shí)導(dǎo)致服務(wù)崩潰
  2. 應(yīng)用服務(wù)使用的共享資源失控.
  3. 依賴的服務(wù),突然延遲增加或者不可用.
  4. 級(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)的可靠性:
  1. 以最小出錯(cuò)的方式設(shè)計(jì)系統(tǒng).降低使用成本.
  2. 分離最容易出錯(cuò)的地方,容易引發(fā)錯(cuò)誤的接口.
  3. 充分的測(cè)試.
  4. 當(dāng)出現(xiàn)人為失誤的時(shí)候支持快速恢復(fù).
  5. 設(shè)置詳細(xì)的監(jiān)控和告警.
  6. 加強(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è)問題:

  1. 負(fù)載增加,在系統(tǒng)資源不變的情況下,服務(wù)的性能會(huì)有什么變化.
  2. 負(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è)方面:

  1. 可運(yùn)維:方便運(yùn)營人員保持系統(tǒng)平穩(wěn)運(yùn)行.
  2. 簡單性:簡化系統(tǒng)的復(fù)雜性.通過抽象等方式來實(shí)現(xiàn).
  3. 可演化: 后續(xù)工程師可以輕松的對(duì)系統(tǒng)進(jìn)行改造.
  • 簡單性:簡化復(fù)雜度
    復(fù)雜性的表現(xiàn)形式多種多樣:狀態(tài)空間膨脹,模塊耦合度高、相互依賴關(guān)系,不一致的命名和術(shù)語、為了性能采用的特殊處理、為了特定問題引入的特殊框架等.
    總結(jié)下來就是:復(fù)雜性來源于實(shí)現(xiàn).
    所以后續(xù)將討論如何做好抽象.
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容