首先我們至少得知道什麼連線吧?
網路通訊的七層協議自不必說,是我們入門網際網路一開始就要學習的,HTTP協議是應用層協議,傳輸層和網路層分別為TCP,IP協議!
也就是說我們建立連線起碼需要TCP協議的三次握手,認證透過之後client和server之間才能保證資料傳輸,才算是連線上了,而斷開連線的時候需要四次揮手,是一個連線斷連(close)的過程!
那麼短連線和長連線又有什麼區別呢?
短連線:經過client發起連線,開始認證(三次握手),資料傳輸,連線關閉(close)!
長連線:經過client發起連線,開始認證,資料傳輸,探測連線,資料傳輸。。。。連線關閉!
短連線追求的是每次通訊之後,就斷開連線,能避免長時間連線對server效能的開銷,而長連線是在建立之後,只有客戶端發起關閉請求,或者服務端探測不到客戶端的響應以後才進行連線的關閉,這樣長連線就不需要多次的建立和銷燬連線,節省建立開銷!
再看看多執行緒,JAVA的多執行緒模型如果對於每一次的連線都需要建立一個執行緒來維護連線,如果為長連線的時候,執行緒不能釋放,按照每個執行緒1M的記憶體消耗,8G的伺服器頂多也只能支撐幾千個連線,更多的連線請求將把伺服器撐爆!
而如果處理短連結,最好使用執行緒池,避免關閉連線的時候執行緒釋放不及時,造成記憶體洩露,使用執行緒池可以保證執行緒複用,在一定量的連線裡,效能更好!
單就連線來看,因為IP協議的限制,最大的連線數為2的48次方,但是假設單單的連線使用記憶體來看,假設只使用了10k記憶體,那麼一臺8g記憶體的機器也只能支援百萬連線,再加上程式保持連線的執行緒,執行緒中的物件消耗等,高併發狀況下的可處理連線就少的可憐了,所以多執行緒處理短連線更有優勢一些!
當然現在的web伺服器處理長連線的方法多如牛毛,避免大量執行緒建立的方法避不開reactor模型,比如netty框架!
區別於多執行緒的處理方式,reactor模型使用一個執行緒(當然現在也會加上監控執行緒啥的),不斷的輪詢連線,有資料傳輸的情況下才進行處理,效能極好!
這種多路複用的模型很是複雜,不在這個回答的範圍內,改天分享!更多的技術分享,敬請關注。。。
首先我們至少得知道什麼連線吧?
網路通訊的七層協議自不必說,是我們入門網際網路一開始就要學習的,HTTP協議是應用層協議,傳輸層和網路層分別為TCP,IP協議!
也就是說我們建立連線起碼需要TCP協議的三次握手,認證透過之後client和server之間才能保證資料傳輸,才算是連線上了,而斷開連線的時候需要四次揮手,是一個連線斷連(close)的過程!
那麼短連線和長連線又有什麼區別呢?
短連線:經過client發起連線,開始認證(三次握手),資料傳輸,連線關閉(close)!
長連線:經過client發起連線,開始認證,資料傳輸,探測連線,資料傳輸。。。。連線關閉!
短連線追求的是每次通訊之後,就斷開連線,能避免長時間連線對server效能的開銷,而長連線是在建立之後,只有客戶端發起關閉請求,或者服務端探測不到客戶端的響應以後才進行連線的關閉,這樣長連線就不需要多次的建立和銷燬連線,節省建立開銷!
再看看多執行緒,JAVA的多執行緒模型如果對於每一次的連線都需要建立一個執行緒來維護連線,如果為長連線的時候,執行緒不能釋放,按照每個執行緒1M的記憶體消耗,8G的伺服器頂多也只能支撐幾千個連線,更多的連線請求將把伺服器撐爆!
而如果處理短連結,最好使用執行緒池,避免關閉連線的時候執行緒釋放不及時,造成記憶體洩露,使用執行緒池可以保證執行緒複用,在一定量的連線裡,效能更好!
單就連線來看,因為IP協議的限制,最大的連線數為2的48次方,但是假設單單的連線使用記憶體來看,假設只使用了10k記憶體,那麼一臺8g記憶體的機器也只能支援百萬連線,再加上程式保持連線的執行緒,執行緒中的物件消耗等,高併發狀況下的可處理連線就少的可憐了,所以多執行緒處理短連線更有優勢一些!
當然現在的web伺服器處理長連線的方法多如牛毛,避免大量執行緒建立的方法避不開reactor模型,比如netty框架!
區別於多執行緒的處理方式,reactor模型使用一個執行緒(當然現在也會加上監控執行緒啥的),不斷的輪詢連線,有資料傳輸的情況下才進行處理,效能極好!
這種多路複用的模型很是複雜,不在這個回答的範圍內,改天分享!更多的技術分享,敬請關注。。。