高并發和多線程總是被一起提起,給人感覺兩者好像相等,實則 高并發 ≠ 多線程
多線程是完成任務的一種方法,高并發是系統運作的一種狀态,通過多線程有助于系統承受高并發狀态的實作。
高并發是一種系統運作過程中遇到的一種“短時間内遇到大量操作請求”的情況,主要發生在web系統集中大量通路或者socket端口集中性收到大量請求(例如:12306的搶票情況;天貓雙十一活動)。該情況的發生會導緻系統在這段時間内執行大量操作,例如對資源的請求,資料庫的操作等。如果高并發處理不好,不僅僅降低了使用者的體驗度(請求響應時間過長),同時可能導緻系統當機,嚴重的甚至導緻OOM異常,系統停止工作等。如果要想系統能夠适應高并發狀态,則需要從各個方面進行系統優化,包括,硬體、網絡、系統架構、開發語言的選取、資料結構的運用、算法優化、資料庫優化……而多線程隻是其中解決方法之一。
實作高并發需要考慮:
系統的架構設計,如何在架構層面減少不必要的處理(網絡請求,資料庫操作等)
網絡拓撲優化減少網絡請求時間、如何設計拓撲結構,分布式如何實作?
系統代碼級别的代碼優化,使用什麼設計模式來進行工作?哪些類需要使用單例,哪些需要盡量減少new操作?
提高代碼層面的運作效率、如何選取合适的資料結構進行資料存取?如何設計合适的算法?
任務執行方式級别的同異步操作,在哪裡使用同步,哪裡使用異步?
JVM調優,是以server模式還是以clien模式運作,如何設定Heap、Stack、Eden的大小,如何選擇GC政策,控制Full GC的頻率?
資料庫優化減少查詢修改時間。資料庫的選取?資料庫引擎的選取?資料庫表結構的設計?資料庫索引、觸發器等設計?是否使用讀寫分離?還 是需要考慮使用資料倉庫?
緩存資料庫的使用,如何選擇緩存資料庫?是Redis還是Memcache? 如何設計緩存機制?
資料通信問題,如何選擇通信方式?是使用TCP還是UDP,是使用長連接配接還是短連接配接?NIO還是BIO?netty、mina還是原生socket?
作業系統選取,是使用winserver還是Linux?或者Unix?
硬體配置?是8G記憶體還是32G,網卡10G還是1G?
……
……
以上的這些問題在高并發中都是必須要深入考慮的,就像木桶原理一樣,隻要其中的某一方面沒有考慮到,都會造成系統瓶頸,影響整個系統的運作。而高并發問題不僅僅涉及面之廣,同時又要求有足夠的深度!!!
而多線程在這裡隻是在同/異步角度上解決高并發問題的其中的一個方法手段,是在同一時刻利用計算機閑置資源的一種方式。
多線程在解決高并發問題中所起到的作用就是使計算機的資源在每一時刻都能達到最大的使用率,不至于浪費計算機資源使其閑置。