應用服務器優化技術


① 分布式緩存:緩存的本質就是內存中的哈希表,如果設計一個優質的哈希函數,那么理論上哈希表讀寫的漸近時間復雜度為O(1)。緩存主要用來存放那些讀寫比很高、變化很少的數據,這樣應用程序讀取數據時先到緩存中讀取,如果沒有或者數據已經失效再去訪問數據庫或文件系統,並根據擬定的規則將數據寫入緩存。對網站數據的訪問也符合二八定律(Pareto分布,冪律分布),即80%的訪問都集中在20%的數據上,如果能夠將這20%的數據緩存起來,那么系統的性能將得到顯著的改善。當然,使用緩存需要解決以下幾個問題:

- 頻繁修改的數據;

- 數據不一致與臟讀;

- 緩存雪崩(可以采用分布式緩存服務器集群加以解決,memcached是廣泛采用的解決方案);

- 緩存預熱;

- 緩存穿透(惡意持續請求不存在的數據)。

② 異步操作:可以使用消息隊列將調用異步化,通過異步處理將短時間高並發產生的事件消息存儲在消息隊列中,從而起到削峰作用。電商網站在進行促銷活動時,可以將用戶的訂單請求存入消息隊列,這樣可以抵御大量的並發訂單請求對系統和數據庫的沖擊。目前,絕大多數的電商網站即便不進行促銷活動,訂單系統都采用了消息隊列來處理。

③ 使用集群。

④ 代碼優化:

- 多線程:基於Java的Web開發基本上都通過多線程的方式響應用戶的並發請求,使用多線程技術在編程上要解決線程安全問題,主要可以考慮以下幾個方面:A. 將對象設計為無狀態對象(這和面向對象的編程觀點是矛盾的,在面向對象的世界中被視為不良設計),這樣就不會存在並發訪問時對象狀態不一致的問題。B. 在方法內部創建對象,這樣對象由進入方法的線程創建,不會出現多個線程訪問同一對象的問題。使用ThreadLocal將對象與線程綁定也是很好的做法,這一點在前面已經探討過了。C. 對資源進行並發訪問時應當使用合理的鎖機制。

- 非阻塞I/O: 使用單線程和非阻塞I/O是目前公認的比多線程的方式更能充分發揮服務器性能的應用模式,基於Node.js構建的服務器就采用了這樣的方式。Java在JDK 1.4中就引入了NIO(Non-blocking I/O),在Servlet 3規范中又引入了異步Servlet的概念,這些都為在服務器端采用非阻塞I/O提供了必要的基礎。

- 資源復用:資源復用主要有兩種方式,一是單例,二是對象池,我們使用的數據庫連接池、線程池都是對象池化技術,這是典型的用空間換取時間的策略,另一方面也實現對資源的復用,從而避免了不必要的創建和釋放資源所帶來的開銷。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM