更不知道起什麼名字。我想概括下一個通用系統(不考慮功能差別)的設計目標和對應實現方法,若是本人公司涉及到的會詳細講一下,也供架構設計搭建參考。本篇是個總體,其中涉及內容會分篇php
目標: ——高性能 ——高可用 ——可擴展 ——成本=》效率(運維,研發效率,測試效率,物理成本與其餘分不開暫不考慮) ——安全
一個系統設計什麼樣子徹底由目標決定,能夠從原來的單機應用服務器擴展到分佈式服務(包含CDN服務器集羣,反向代理服務器集羣,分佈式微服務集羣,通用數據代理集羣,分佈式緩存集羣,分佈式文件服務器,分佈式數據庫服務器等)
舉個例子一個簡單的通用系統邏輯架構以下:
react
多進程,單進程多線程
每一個獨立線程處理請求模式:異步、同步(actor,reactor,preactor)
每一個獨立線程處理網絡IO模式:阻塞、非阻塞、非阻塞多路複用(select,poll,epoll)
底層IO:同步、異步(NIO)
數據共享:加鎖/通訊傳遞actor
見:https://segmentfault.com/a/11...nginx
1.緩存
本地數據緩存:在存儲中講,略
分佈式數據緩存:在存儲中講,略
CDN:見https://segmentfault.com/a/11...
2.擴展服務器,任務分配器(負載均衡)
須要關注分配器選型(硬件F5,軟件LVS,nginx)、分配器與服務器之間鏈接管理,創建,檢測,中斷後處理、分配算法
負載均衡總體上方案
1)可負載均衡位置和方案算法
DNS
負載均衡LVS
見:https://segmentfault.com/a/11... nginx
見:https://segmentfault.com/a/11... 2)負載均衡算法spring
3.任務拆分
簡單的系統更容易作到高性能,同時提升擴展性,在擴展性中說
3.通訊
公司入網部署 見:https://segmentfault.com/a/11...
長鏈接 見:https://segmentfault.com/a/11...
網絡協議 如下見:https://segmentfault.com/a/11...數據庫
多數穩定性建設是故障前建設。故障中減低影響,故障後補償segmentfault
1.部署,能夠1主多備或多主多備。
主備(單活):冷備(主從),溫被(業務系統一直啓動,但不對外提供服務)
集羣(多活):對稱集羣(負載均衡),非對稱集羣,任務分配器
2.任務分配器
分配算法更復雜,須要有角色狀態能力,若多主還須要考慮儘可能同一用戶落入單機房,固然也能夠簡單的人工切換。
高可用狀態決策緩存
1.一個決策者,多個上報者 2.2個機器協商,注意腦裂檢測 3.民主決策,=》腦裂 當集羣鏈接中斷,解決辦法投票節點數必須超過系統總節點一半,當可用少於一半時系統不可用
任務管理:某臺服務器失敗,是否要以及如何從新分配到新的服務器執行
3.異地多活(活不是備)安全
接口級故障,保證核心業務和絕大部分用戶(bug等內存耗盡等,第三方系統大量請求或響應慢,攻擊,促銷等)服務器
存儲的東西涉及較多,獨立見https://segmentfault.com/a/11...
常見拆分方案:
1.面向流程(UI,業務,數據,存儲)
分層架構 保證各層之間的差別足夠清晰,邊界明顯,本質就是隔離關注點,要保證層與層之間的依賴是穩定的,B/S,C/S MVC(邏輯都在M,C只是轉發)/MVP(邏輯在P,M是數據),邏輯分層(自頂向下依賴好比端=》框架=》庫=》內核),建議層層不能被跨越,兩兩依賴,不然時間久會亂好比sdk和common。缺點是冗餘和每次都要通過全部層
2.面向服務
3.面向功能:微內核(插件化架構)
插件管理,註冊,加載時機。插件鏈接(OSGI,消息模式,依賴注入spring,分佈式協議rpc等)。插件通訊(核心模塊實現)
好比OSGI,Eclipse的Equinox。service層(bundle註冊),lifecycle(管理bundle的安裝更新啓動中止卸載),bundle
規則引擎架構(開源drools),
todo