“高並發和多線程”總是被被一起提起,給人的感覺好像他們相等,其實 高並發 不等於 多線程。
多線程是完成任務的一種方法,高並發是系統運行的一種狀態,通過多線程有助於系統承受高並發的狀態的實現。
高並發是系統運行過程張遇到的一種“短時間內遇到大量的操作請求” 的情況,主要發生在web系統集中大量訪問或者socket端口集中行收到大量請求(例如12306搶票;天貓雙十一活動)。該情況會導致系統在這段時間內大量操作,例如對資源的請求,對數據庫的集中操作等。如果並發處理不好,不僅降低了客戶體驗度(請求時間過長) ,同時可能導致宕機,系統停止工作等。如果想要系統適應高並發的狀態,則需要從,硬件,軟件,網絡,系統架構,開發語言的選取,數據結構的運用,算法優化,數據庫優化等。。。而多線程只是解決方案其中之一。
實現高並發需要考慮:
(1)系統的架構設計,如何在架構層面減少不必要的處理(網絡請求,數據庫操作等)
(2)網絡拓撲優化網絡請求的時間,如何設置網絡拓撲的結構,分布式如何實現
(3)服務集群,負載均衡
(4)系統代碼級別的優化,如何選取合適的設計模式,哪些需要是單例,哪些需要是盡量減少new操作
(5)提高代碼層面的運行效率,如何選取合適的數據結構進行數據的存取,如何設計合適的算法。
(6)任務級別的同異步操作,在哪里同步,在哪里異步。
(7)jvm調優 是以server模式還是以client模式運行,如何設置Heap、Stack、Eden的大小,如何選擇GC策略,控制Full GC的頻率。
(8)數據庫級別的優化,如何減少增刪改查的時間。數據庫的選取,數據庫表設計,數據庫索引,觸發器的設計。是否使用讀寫分離,是否考慮數據倉庫。
(9)緩存數據庫的使用,如何選取緩存數據庫?是使用Redis還是使用Memcache?如何設置緩存機制。
(10)數據通訊問題,如何選擇數據通訊方式?是使用TCP還是UDP,是使用長連接還是短連接,是NIO還是BIO,是netty還是原生的socket?
(11)操作系統的選取是winserver還是Linux還是Unix、
(12)硬件的配置,8G內存還是32G內存...
以上問題需要在高並發中深入的考慮,想木桶原理一樣,只要其中的某一個方面沒有考慮到,會造成系統的瓶頸,影響整的性能。而高並發不僅涉及面之廣而且有要求有足夠的深度。
多線程知識從同/異步角度上解決高並發的問題的其中之一的方法手段,是在同一時刻利用計算的閑置資源。
多線程在解決高並發的問題中所起到的作用是使用計算機的資源在每一個時刻都能達到最大的利率,不至於浪費計算機的閑置資源。