前言
在設(shè)計一個系統(tǒng)的時候,因為場景
露泊、時間而異
喉镰、資源配備
等不是一下子就能設(shè)計得非常完美,在有限的資源下解決最核心的問題惭笑,預(yù)測并發(fā)現(xiàn)以后可能出現(xiàn)的問題侣姆,并逐步解決,所以說系統(tǒng)設(shè)計是一個不斷迭代的過程
沉噩,不要過度設(shè)計捺宗,從迭代中演變和完善。
關(guān)于并發(fā)川蒙?
并發(fā)包括并行從概念上來講都是為了提高效率蚜厉,在最短的時間內(nèi)怎么來完成最多的事情。
包括現(xiàn)在的雙十一派歌、雙十二等等弯囊,在一秒鐘完成了多少的訂單,這些都會涉及到并發(fā)胶果。
并發(fā)和并行
有大神關(guān)于兩者的闡述:“并發(fā)關(guān)乎結(jié)構(gòu)匾嘱,并行關(guān)乎執(zhí)行”
-
并發(fā)
:在不同時間內(nèi)處理多個任務(wù),單個CPU輪流使用早抠。比方說在你吃飯的時候去上了個廁所又回來吃飯霎烙。 -
平行
:同時處理多個任務(wù),多個CPU執(zhí)行蕊连。比方說你邊吃飯邊上廁所悬垃。
并發(fā)類型
-
計算密集型
:需要非常多的CPU計算資源,對于密集型完全取決CPU核數(shù)甘苍,避免過多的線程上下文切換來充分發(fā)揮優(yōu)勢尝蠕,理想方案:JDK1.8中增加了一個并行計算,較理想線程數(shù)=CPU核數(shù)*2 -
IO密集型
:涉及到大量的網(wǎng)絡(luò)傳輸载庭,不僅如此看彼,和數(shù)據(jù)庫廊佩、和緩存間的交互也涉及到IO,一旦發(fā)生IO靖榕,當(dāng)前就會進(jìn)入等待狀態(tài)标锄,當(dāng)IO結(jié)束,數(shù)據(jù)準(zhǔn)備好后茁计,才會繼續(xù)執(zhí)行料皇。理想方案:線程數(shù)=CPU核數(shù)/(1-阻塞系數(shù)),這個阻塞系數(shù)一般為0.8~0.9之間星压。
設(shè)計高并發(fā)原則
-
無狀態(tài)
:無狀態(tài)就是無需做持久化操作践剂,有狀態(tài)就會涉及到數(shù)據(jù)同步,消耗內(nèi)存消耗寬帶同時還會涉及到鎖的操作租幕,影響快速擴(kuò)容舷手。 -
粒度化
:讀寫分離也好,應(yīng)用服務(wù)化也好就是為了控制之間的依賴劲绪,分散請求提高并發(fā)效率男窟,同時管理起來也比較清晰。 -
場景化
:合適的場景選擇合適的技術(shù)(消息隊列贾富、數(shù)據(jù)異構(gòu)歉眷、緩存銀彈、并發(fā)化)-
消息隊列
:解耦一些不需要同步調(diào)用的服務(wù)颤枪,或者訂閱一些關(guān)心的變化汗捡,還能流量削峰/緩沖,某些場景會有重復(fù)消息(弊端)畏纲,可以在業(yè)務(wù)層做防重和校對處理扇住。
RDBMS注重的是ACID,NOSQL注重的是CAP和BASE盗胀,一般是犧牲強(qiáng)一致性艘蹋,而保證最終一致性。
-
數(shù)據(jù)異構(gòu)
:我們都知道系統(tǒng)都是由數(shù)據(jù)構(gòu)成的票灰,而數(shù)據(jù)的存儲位置和獲取的環(huán)境不一樣女阀,速度也就不一樣。單表肯定比聯(lián)表快屑迂,內(nèi)存取肯定比磁盤取快浸策;就像前面的文章有提過,也是我個人非常喜歡的一句話:時間換空間惹盼,空間換時間
庸汗。所以可以根據(jù)實際場景和業(yè)務(wù)來設(shè)計,包括根據(jù)數(shù)據(jù)的權(quán)重犧牲一部分的資源來提高效率手报,例如:聯(lián)表可以考慮數(shù)據(jù)冗余夫晌,或者關(guān)鍵數(shù)據(jù)的獲取合并存儲雕薪。 -
緩存銀彈
:緩存對于讀取服務(wù)來說就是顆抗流量的特效武器昧诱。
-
并發(fā)化
:并發(fā)化的理論其實很簡單晓淀,把沒有依賴關(guān)系的數(shù)據(jù)并行獲取≌档担可能不太好理解凶掰,例如:B依賴A C沒有依賴 D依賴B,那么最好的方式就是A蜈亩、C并行獲取懦窘,然后再獲取B,再是D稚配。
-
附上設(shè)計例圖:
結(jié)語
關(guān)于例圖里面的一些詳細(xì)示例以后再慢慢補(bǔ)充吧畅涂,說了淺談就是淺談,要有原則(別打我~~~)道川!
里面的圖片用的是思維導(dǎo)圖Xmind做的午衰。
推薦:淺談高可用和設(shè)計的一些原則(JAVA)
個人博客~
簡書~