使用Java開發(fā)高性能網(wǎng)站需要關(guān)注的那些事兒

JVMJEE容器中運行的JVM參數(shù)配置參數(shù)的正確使用直接關(guān)系到整個系統(tǒng)的性能和處理" />

国产成人精品无码青草_亚洲国产美女精品久久久久∴_欧美人与鲁交大毛片免费_国产果冻豆传媒麻婆精东

15158846557 在線咨詢 在線咨詢
15158846557 在線咨詢
所在位置: 首頁 > 營銷資訊 > 網(wǎng)站運營 > 用Java做一個大流量、高并發(fā)的網(wǎng)站應(yīng)該怎么樣進行底層構(gòu)架?采用哪些框架技

用Java做一個大流量、高并發(fā)的網(wǎng)站應(yīng)該怎么樣進行底層構(gòu)架?采用哪些框架技

時間:2024-01-10 18:00:02 | 來源:網(wǎng)站運營

時間:2024-01-10 18:00:02 來源:網(wǎng)站運營

用Java做一個大流量、高并發(fā)的網(wǎng)站應(yīng)該怎么樣進行底層構(gòu)架?采用哪些框架技術(shù)比較適合?:詳見

使用Java開發(fā)高性能網(wǎng)站需要關(guān)注的那些事兒


JVM
JEE容器中運行的JVM參數(shù)配置參數(shù)的正確使用直接關(guān)系到整個系統(tǒng)的性能和處理能力,JVM的調(diào)優(yōu)主要是對內(nèi)存管理方面的調(diào)優(yōu),優(yōu)化的方向分為以下4點:
1.HeapSize 堆的大小,也可以說Java虛擬機使用內(nèi)存的策略,這點是非常關(guān)鍵的。
2.GarbageCollector 通過配置相關(guān)的參數(shù)進行Java中的垃圾收集器的4個算法(策略)進行使用。
3.StackSize 棧是JVM的內(nèi)存指令區(qū),每個線程都有他自己的Stack,Stack的大小限制著線程的數(shù)量。
4.DeBug/Log 在JVM中還可以設(shè)置對JVM運行時的日志和JVM掛掉后的日志輸出,這點非常的關(guān)鍵,根據(jù)各類JVM的日志輸出才能配置合適的參數(shù)。
網(wǎng)上隨處可見JVM的配置技巧,但是我還是推薦閱讀Sun官方的2篇文章,可以對配置參數(shù)的其所依然有一個了解
1.Java HotSpot VM Options
Java HotSpot VM Options
2.Troubleshooting Guide for Java SE 6 with HotSpot VMTroubleshooting Guide for Java SE 6 with HotSpot VM
另外,我相信不是每個人攻城師都是天天對著這些JVM參數(shù)的,如果你忘記了那些關(guān)鍵的參數(shù)你可以輸入Java -X(大寫X)進行提示。

JDBC
針對MySQL的JDBC的參數(shù)在之前的文章中也有介紹過,在單臺機器或者集群的環(huán)境下合理的使用JDBC中的配置參數(shù)對操作數(shù)據(jù)庫也有很大的影響。
一些所謂高性能的 Java ORM開源框架也就是打開了很多JDBC中的默認(rèn)參數(shù):
1.例如:autoReconnect、prepStmtCacheSize、cachePrepStmts、useNewIO、blobSendChunkSize 等,
2.例如集群環(huán)境下:roundRobinLoadBalance、failOverReadOnly、autoReconnectForPools、secondsBeforeRetryMaster。
具體內(nèi)容可以參閱MySQL的JDBC官方使用手冊:
http://dev.mysql.com/doc/refman/5.1/zh/connectors.html#cj-jdbc-reference

數(shù)據(jù)庫連接池(DataSource)
應(yīng)用程序與數(shù)據(jù)庫連接頻繁的交互會給系統(tǒng)帶來瓶頸和大量的開銷會影響到系統(tǒng)的性能,JDBC連接池負(fù)責(zé)分配、管理和釋放數(shù)據(jù)庫連接,它允許應(yīng)用程序重復(fù)使用一個現(xiàn)有的數(shù)據(jù)庫連接,而再不是重新建立一個連接,因此應(yīng)用程序不需要頻繁的與數(shù)據(jù)庫開關(guān)連接,并且可以釋放空閑時間超過最大空閑時間的數(shù)據(jù)庫連接來避免因為沒有釋放數(shù)據(jù)庫連接而引起的數(shù)據(jù)庫連接遺漏。這項技術(shù)能明顯提高對數(shù)據(jù)庫操作的性能。
在此我認(rèn)為有一點需要說明:
連接池的使用也是需要關(guān)閉,因為在數(shù)據(jù)庫連接池啟動的時候就預(yù)先和數(shù)據(jù)庫獲得了相應(yīng)的連接,之后不再需要應(yīng)用程序直接的和數(shù)據(jù)庫打交道,因為應(yīng)用程序使用數(shù)據(jù)庫連接池是一個“借”的概念,應(yīng)用程序從數(shù)據(jù)庫連接池中獲得資源是“借出”,還需要還回去,就好比有20個水桶放在這里,需要拿水的人都可以使用這些木桶從水池里面拿水,如果20個人都拿完水,不將水桶還回原地,那么后面來的人再需要拿水,只能在旁邊等待有人將木桶還回去,之前的人用完后需要放回去,不然后面的人就會一直等待,造成資源堵塞,同理,應(yīng)用程序獲取數(shù)據(jù)庫連接的時候Connection連接對象的時候是從“池”中分配一個數(shù)據(jù)庫連接出去,在使用完畢后,歸還這個數(shù)據(jù)庫連接,這樣才能保持?jǐn)?shù)據(jù)庫的連接“有借有還”準(zhǔn)則。
參考資料:
http://dev.mysql.com/doc/refman/5.1/zh/connectors.html#cj-connection-pooling

數(shù)據(jù)存取
數(shù)據(jù)庫服務(wù)器的優(yōu)化和數(shù)據(jù)的存取,什么類型的數(shù)據(jù)放在什么地方更好是值得去思考的問題,將來的存儲很可能是混用的,Cache,NOSQL,DFS,DataBase 在一個系統(tǒng)中都會有,生活的餐具和平日里穿衣服需要擺放在家里,但是不會用同一種類型的家具存放,貌似沒有那個人家把餐具和衣服放在同一個柜子里面的。這就像是系統(tǒng)中不同類型的數(shù)據(jù)一樣,對不同類型的數(shù)據(jù)需要使用合適的存儲環(huán)境。文件和圖片的存儲,首先按照訪問的熱度分類,或者按照文件的大小。強關(guān)系類型并且需要事務(wù)支持的采用傳統(tǒng)的數(shù)據(jù)庫,弱關(guān)系型不需要事務(wù)支持的可以考慮NOSQL,海量文件存儲可以考慮一下支持網(wǎng)絡(luò)存儲的DFS,至于緩存要看你單個數(shù)據(jù)存儲的大小和讀寫的比例。
還有一點值得注意就是數(shù)據(jù)讀寫分離,無論在DataBase還是NOSQL的環(huán)境中大部分都是讀大于寫,因此在設(shè)計時還需考慮 不僅僅需要讓數(shù)據(jù)的讀分散在多臺機器上,還需要考慮多臺機器之間的數(shù)據(jù)一致性,MySQL的一主多從,在加上MySQL-Proxy或者借用JDBC中的一些參數(shù)(roundRobinLoadBalance、failOverReadOnly、autoReconnectForPools、secondsBeforeRetryMaster)對后續(xù)應(yīng)用程序開發(fā),可以將讀和寫分離,將大量讀的壓力分散在多臺機器上,并且還保證了數(shù)據(jù)的一致性。

緩存
在宏觀上看緩存一般分為2種:本地緩存和分布式緩存
1.本地緩存,對于Java的本地緩存而言就是講數(shù)據(jù)放入靜態(tài)(static)的數(shù)據(jù)結(jié)合中,然后需要用的時候就從靜態(tài)數(shù)據(jù)結(jié)合中拿出來,對于高并發(fā)的環(huán)境建議使用 ConcurrentHashMap或者CopyOnWriteArrayList作為本地緩存。緩存的使用更具體點說就是對系統(tǒng)內(nèi)存的使用,使用多少內(nèi)存的資源需要有一個適當(dāng)比例,如果超過適當(dāng)?shù)氖褂么鎯υL問,將會適得其反,導(dǎo)致整個系統(tǒng)的運行效率低下。
2. 分布式緩存,一般用于分布式的環(huán)境,將每臺機器上的緩存進行集中化的存儲,并且不僅僅用于緩存的使用范疇,還可以作為分布式系統(tǒng)數(shù)據(jù)同步/傳輸?shù)囊环N手段,一般被使用最多的就是Memcached和Redis。
數(shù)據(jù)存儲在不同的介質(zhì)上讀/寫得到的效率是不同的,在系統(tǒng)中如何善用緩存,讓你的數(shù)據(jù)更靠近cpu,下面有一張圖你需要永遠牢記在心里,來自Google的技術(shù)大牛Jeff Dean(Ref)的杰作,如圖所示:

并發(fā)/多線程
在高并發(fā)環(huán)境下建議開發(fā)者使用JDK中自帶的并發(fā)包(java.util.concurrent),在JDK1.5以后使用java.util.concurrent下的工具類可以簡化多線程開發(fā),在java.util.concurrent的工具中主要分為以下幾個主要部分:
1.線程池,線程池的接口(Executor、ExecutorService)與實現(xiàn)類(ThreadPoolExecutor、 ScheduledThreadPoolExecutor),利用jdk自帶的線程池框架可以管理任務(wù)的排隊和安排,并允許受控制的關(guān)閉。因為運行一個線程需要消耗系統(tǒng)CPU資源,而創(chuàng)建、結(jié)束一個線程也對系統(tǒng)CPU資源有開銷,使用線程池不僅僅可以有效的管理多線程的使用,還是可以提高線程的運行效率。
2.本地隊列,提供了高效的、可伸縮的、線程安全的非阻塞 FIFO 隊列。java.util.concurrent 中的五個實現(xiàn)都支持?jǐn)U展的 BlockingQueue 接口,該接口定義了 put 和 take 的阻塞版本:LinkedBlockingQueue、ArrayBlockingQueue、SynchronousQueue、PriorityBlockingQueue 和 DelayQueue。這些不同的類覆蓋了生產(chǎn)者-使用者、消息傳遞、并行任務(wù)執(zhí)行和相關(guān)并發(fā)設(shè)計的大多數(shù)常見使用的上下文。



詳見

使用Java開發(fā)高性能網(wǎng)站需要關(guān)注的那些事兒

關(guān)鍵詞:采用,流量

74
73
25
news

版權(quán)所有? 億企邦 1997-2025 保留一切法律許可權(quán)利。

為了最佳展示效果,本站不支持IE9及以下版本的瀏覽器,建議您使用谷歌Chrome瀏覽器。 點擊下載Chrome瀏覽器
關(guān)閉