在設計一個系統的時候,由於場景
、時間而異
、資源配備
等不是一會兒就能設計得很是完美,在有限的資源下解決最核心的問題,預測並發現之後可能出現的問題,並逐步解決,因此說系統設計是一個不斷迭代的過程
,不要過分設計,從迭代中演變和完善。git
關於併發? 併發包括並行從概念上來說都是爲了提升效率,在最短的時間內怎麼來完成最多的事情。 包括如今的雙11、雙十二等等,在一秒鐘完成了多少的訂單,這些都會涉及到併發。 併發和並行 有大神關於二者的闡述:「併發關乎結構,並行關乎執行」
github
併發
:在不一樣時間內處理多個任務,單個CPU輪流使用。比方說在你吃飯的時候去上了個廁所又回來吃飯。平行
:同時處理多個任務,多個CPU執行。比方說你邊吃飯邊上廁所。併發類型數據庫
計算密集型
:須要很是多的CPU計算資源,對於密集型徹底取決CPU核數,避免過多的線程上下文切換來充分發揮優點,理想方案:JDK1.8中增長了一個並行計算,較理想線程數=CPU核數*2IO密集型
:涉及到大量的網絡傳輸,不只如此,和數據庫、和緩存間的交互也涉及到IO,一旦發生IO,當前就會進入等待狀態,當IO結束,數據準備好後,纔會繼續執行。理想方案:線程數=CPU核數/(1-阻塞係數),這個阻塞係數通常爲0.8~0.9之間。設計高併發原則緩存
無狀態
:**無狀態就是無需作持久化操做,有狀態就會涉及到數據同步,消耗內存消耗寬帶同時還會涉及到鎖的操做,影響快速擴容。粒度化
:**讀寫分離也好,應用服務化也好就是爲了控制之間的依賴,分散請求提升併發效率,同時管理起來也比較清晰。場景化
:**合適的場景選擇合適的技術(消息隊列、數據異構、緩存銀彈、併發化)
消息隊列
:解耦一些不須要同步調用的服務,或者訂閱一些關心的變化,還能流量削峯/緩衝,某些場景會有重複消息(弊端),能夠在業務層作防重和校對處理。
數據異構
:咱們都知道系統都是由數據構成的,而數據的存儲位置和獲取的環境不同,速度也就不同。單表確定比聯錶快,內存取確定比磁盤取快;就像前面的文章有提過,也是我我的很是喜歡的一句話:時間換空間,空間換時間
。因此能夠根據實際場景和業務來設計,包括根據數據的權重犧牲一部分的資源來提升效率,例如:聯表能夠考慮數據冗餘,或者關鍵數據的獲取合併存儲。緩存銀彈
:緩存對於讀取服務來講就是顆抗流量的特效武器。
併發化
:併發化的理論其實很簡單,把沒有依賴關係的數據並行獲取。可能不太好理解,例如:B依賴A C沒有依賴 D依賴B,那麼最好的方式就是A、C並行獲取,而後再獲取B,再是D。附上設計例圖: 網絡
關於例圖裏面的一些詳細示例之後再慢慢補充吧,說了淺談就是淺談,要有原則(別打我~~~)!
裏面的圖片用的是思惟導圖Xmind作的。
推薦:淺談高可用和設計的一些原則(JAVA)
我的博客~
簡書~併發