程序員如何開發(fā)高效的程序,這項技術(shù)值得了解
幾乎每一個網(wǎng)站都是這么一個設(shè)計模式,先是前端接入層,然后是一些后臺的邏輯服務(wù),最后則是數(shù)據(jù)庫。大家都知道,做一個10人能夠訪問的程序非常簡單,但是要做一個能夠同時滿足1萬人,100萬人同時使用的程序,卻是非常的難。今天我們來介紹程序員高并發(fā)架構(gòu)中的池化技術(shù)。
講池化技術(shù)之前,我們來講一個現(xiàn)實中的例子,相信大家都去過網(wǎng)吧吧,十幾年前,那個時候SSD的硬盤還非常昂貴,很多網(wǎng)吧都是普通的磁盤,開機非常慢,有些網(wǎng)吧為了提升用戶體驗,就會提前幫你把機器開好,那樣子你去上網(wǎng)的時候,就不需要開機,直接就能上網(wǎng),這便是池化技術(shù)。早上的時候上網(wǎng)的人少些,網(wǎng)管可能只打開10臺機器,到了晚上,可能人會多些,網(wǎng)管會打開30臺機器,這便是池化技術(shù)中的池大小調(diào)節(jié)。
程序員的技術(shù)棧中有非常多的池,如線程池、連接池、對象池、內(nèi)存池,今天我們就來簡單的介紹介紹,各種池。
連接池
相信每一個程序員都不陌生,我們在使用Redis等緩存或者Mysql等數(shù)據(jù)庫的時候,就常常需要配置連接池,相信每個Java程序員都配置過C3P0或者HikariCP的連接池,為什么我們需要連接池,它有什么好處?
如果沒有連接池,當(dāng)我們訪問數(shù)據(jù)庫的時候,會發(fā)生什么事情,首先我們需要建立連接把,建立連接,以為著要三次握手,這就需要花個好幾毫秒的時間,緊接著,不是每個人都能訪問數(shù)據(jù)庫吧,數(shù)據(jù)庫它也需要驗證登陸的賬戶密碼,這又要花個1,2毫秒,然后才是真正的數(shù)據(jù)查詢,可能就花了1,2毫秒,一個10毫秒的請求,可能80%的時間都浪費了。
其次,連接池可以讓服務(wù)更加穩(wěn)定,舉個例子,假如下游的數(shù)據(jù)庫支持一千個并發(fā),但是業(yè)務(wù)層支持一萬個并發(fā),這個時候有可能會發(fā)生什么事情,業(yè)務(wù)層的一萬個請求同時請求數(shù)據(jù)庫,超過的下游系統(tǒng)的最大負荷,這不是把服務(wù)搞死么?連接池可以讓我們給不同的業(yè)務(wù)分配不同的連接數(shù),讓他們的總數(shù)不會超過系統(tǒng)的最大值。
對象池
在Java語言中,垃圾回收是非常令人頭痛的事情,特別是FullGC總是會引發(fā)一些問題,不止是Java很多語言都有這樣的一個問題。舉個例子,假如我們開發(fā)一款游戲,士兵對象的一個實例表示一只長槍小兵,可能玩家在一把游戲中,要打死成千上百只小兵,那么每次一只小兵死亡我們就要注銷掉這個實例,每次有小兵刷新我們就重新new一個實例。大家都知道,向操作系統(tǒng)申請內(nèi)存是有代價的,可能你是款單機游戲還好,如果是大型的網(wǎng)絡(luò)游戲,頁面上頻繁有各個玩家打斗發(fā)生,這個時候我們最好使用對象池技術(shù),當(dāng)小兵死亡的時候,將它回收,而不是直接釋放,下次有新的小兵出現(xiàn)的時候,直接復(fù)用。
對象池技術(shù),減少了程序頻繁向操作系統(tǒng)申請內(nèi)存,特別是大塊內(nèi)存,我們更需要使用對象池技術(shù),更好地優(yōu)化內(nèi)存的使用,減少垃圾回收次數(shù),從而讓程序更加優(yōu)化。
線程池
與對象池類似,我們可以理解線程也是操作系統(tǒng)使用的一個對象,在現(xiàn)代計算機開發(fā)中,多線程是非常常見且必須的,可以有效的利用到CPU多個核心的特點,但是操作系統(tǒng)創(chuàng)建線程跟銷毀線程又有一定的開銷,所以,我們可以使用池化技術(shù),但操作系統(tǒng)運行完某個線程之后,不是立即銷毀,而是讓這個空閑的線程繼續(xù)等待新的任務(wù)去執(zhí)行。
內(nèi)存池
內(nèi)存池,這個可能使用C++的同學(xué)使用的比較多,最為代表的便是由谷歌開發(fā)的TcMalloc與Facebook開發(fā)的JeMalloc。其實,Java開發(fā)中也會用到內(nèi)存池,Java中有一些Unsafe的方法,可以直接管理內(nèi)存,在一些中間件的開發(fā)中,我們會經(jīng)常用到。
內(nèi)存池較大的作用,便是減少內(nèi)存碎片,什么是內(nèi)存碎片?很多同學(xué)不理解什么是內(nèi)存碎片,我們舉一個例子。我們得到了一塊木材,想用來做椅子,如果不對椅子每個部件需要的木材進行規(guī)劃,想用啥就在木頭上切下來,那么最終這個木頭的利用率肯定不高。內(nèi)存也是如此,如果每次申請都是隨便分配,那就容易形成很多內(nèi)存碎片,最后讓程序變慢。
總結(jié)
好了,今天我們就分享到這里,希望對你有所啟發(fā)。歡迎大家關(guān)注我,會跟大家一起學(xué)習(xí)分享計算機相關(guān)知識。大家的支持是我繼續(xù)嘮嗑的動力。