數據密集型程序:問題一般來自數據量,數據複雜性,以及數據的變動速度。數據庫
數據庫:存儲數據,以便本身或其餘應用程序以後能再次找到。緩存
緩存:記住開銷昂貴的操做的結果,加快讀取速度。安全
搜索索引:容許用戶按關鍵字搜索數據,或以各類方式對數據進行過濾。服務器
流處理:向其餘進程發送消息,進行異步處理。網絡
系統在發生硬件故障,軟件故障,或人爲錯誤時,任然能夠正常工做。
當集羣足夠大,硬件故障老是會發生,可能存在硬盤崩潰,內存出錯,機房斷點,有人拔錯網線…等等,都會形成硬件不可用的狀態。負載均衡
主要有:框架
軟件中的系統故障沒有速藥,可是有不少小辦法:運維
人類是不可靠的。異步
儘管人類是不可靠的,但怎麼作才能讓系統變得可靠?最好的系統會組合使用一下幾種方法:工具
有合理的辦法應對系統的增加(數據量,流量,複雜性),可擴展性是用來描述系統對應負載均衡增加能力的術語。討論可擴展性意味着考慮諸如:若是系統以特定方式增加,有什麼選項能夠應對增加?或 如何增長計算資源來處理額外的負載 等問題。
負載能夠用一些稱爲「負載參數」的數字來描述。
它多是 每秒向Web服務器發出的請求,數據庫中的讀寫比率,聊天室職中同時活躍的用戶數量,緩存命中率或其餘東西
一旦系統的負載被描述好,就能夠研究當前負載增長會發生什麼。咱們能夠從兩個角度來看:
當負載參數增長時,如何保持良好的性能?
兩種擴展思路:縱向擴展(轉向更強大的機器),橫向擴展(將負載分佈到多臺小機器上)。
有些系統是彈性的,這意味着能夠在檢測到負載增長時自動增長計算子資源,而其餘系統則是手動擴展。
什麼是可維護性?
工程師和運維在不一樣的生命週期,都能高效的在系統上工做。軟件的大部分開銷並不在最初的開發階段,而是在持續的維護階段,包括修復漏洞,保持系統正常運行,調查失效,適配新的平臺,爲新的場景進行修改,償還技術債,添加新的功能等等。
軟件在設計之初,就儘可能考慮可能減小維護期間的痛苦,從而避免本身的軟件系統變成遺留系統,爲此,咱們將特別關注軟件系統的三個設計原則:
可操做性
便於運維團隊保持系統平穩運行。
簡單性
從系統中消除儘量多的複雜度,使新工程師也能輕鬆理解系統。
可演化性
使工程師在將來能輕鬆地對系統進行更改,當需求變化時爲新應用場景作適配,也稱爲可擴展性,可修改性,或可塑性。
數據系統能夠經過各類方式使平常任務更輕鬆:
一個陷入複雜泥潭的軟件項目有時被描述爲爛泥譚
由於福再度致使維護困難時,預算和時間安排一般會超支。當開發人員難以理解系統時,隱藏的假設,無心的後果和意外的交互就更容易被忽略。相反,下降複雜度能極大的提升軟件的可維護性,所以簡單性應該是構建系統的一個關鍵目標。
簡化系統並不必定覺得着減小功能:它也能夠意味着消除額外的複雜度。
額外的複雜度指:在具體實現中出現,而非(從用戶視角看,系統所解決的)問題自己固有的複雜度。
用於消除額外複雜度的最好工具之一是抽象。一個好的抽象能夠將大量實現細節影藏在一個乾淨,簡單易懂的外觀下面。
系統的需求永遠不變,基本是不可能的,更真實的是一直處於常態的變化中。
在組織流程上,敏捷工做模式就是爲了適應變化提供的一個框架。
在數據系統層面的敏捷性使用可演化性來替代。