自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

高性能、高流量Java Web站點打造的22條建議

云計算
流量的激增讓眾多機構(gòu)“疲于奔命”,高擴展性、面向服務(wù)的架構(gòu)已成為當(dāng)務(wù)之急。這里為大家分享打造高流量網(wǎng)站的22個建議,其中包括數(shù)據(jù)庫、緩存、架構(gòu)等多個方面。

從2005年-2013年,Ashwanth Fernando曾供職于Best Buy、Pearson VUE、Walgreens、Walmart eCommerce等多家知名公司,現(xiàn)在Apple從事高級工程師、平臺工程師一職,擁有豐富的高流量Web應(yīng)用程序打造及架構(gòu)經(jīng)驗,近日Ashwanth撰文分享了他的高流量Web軟件打造經(jīng)驗。

下為譯文

受Joshua Bloch寫的《Effective Java》啟發(fā),我想分享自己關(guān)于建立高流量Web軟件的整體建議。這些術(shù)語中的一些可能不僅僅關(guān)于軟件設(shè)計也關(guān)于工程組織、文化等相關(guān)領(lǐng)域。

免責(zé)聲明

只代表個人觀點

如發(fā)現(xiàn)與現(xiàn)實情況相違背的原則,請謹(jǐn)慎對待,或使用一般認(rèn)識

1. 考慮使用不止一個數(shù)據(jù)中心

在商務(wù)領(lǐng)域,一直存在許多恐怖的道聽途說,而這些恐慌都因為他們只使用了單一的數(shù)據(jù)中心。如果你想在自然災(zāi)害或者電力供應(yīng)故障中幸免,那么請使用多于1個的數(shù)據(jù)中心,使用active-active模式來配置你所有的數(shù)據(jù)中心。雖然在開銷上可能會有所增加,但是比只使用單active的配置要值得多——因為在passive和active副本上,總會發(fā)現(xiàn)有些數(shù)據(jù)片不一致。

2. 考慮使用稀疏數(shù)據(jù)中心部署

不管是通過PaSS,還是運營團(tuán)隊進(jìn)行,當(dāng)軟件集群被部署到同一個數(shù)據(jù)中心的機架上時,確保這些機架使用不同的電力供應(yīng)。你不可能保證機架供電的萬無一失,一旦失敗將會導(dǎo)致整個機架上服務(wù)器的丟失,這個時候你絕對不會希望整個數(shù)據(jù)中心都只連在一個電路上。

3. 考慮使用私有云來組織資源

IaaS開源解決方案Openstack等其他的軟件至今尚未成熟,需要龐大的團(tuán)隊來運營,在運行期間會產(chǎn)生各種各樣的問題,除非你有足夠的預(yù)算,否則別考慮建立一個私有的云服務(wù)。然而,私有云可以提供眾多優(yōu)勢。首先在部署方面就可以進(jìn)行眾多的定制化,這遠(yuǎn)比AWS或者是Rackspace貨架上的選擇要多。其次它允許你做許多的硬件定制化,就好比在硬件層次的Oracle就比準(zhǔn)虛擬化環(huán)境快得多。

4. 考慮使用PaaS做解決方案

為軟件釋放投入巨量人力進(jìn)行部署的日子已接近盡頭,各個機構(gòu)在敏捷及快速市場投放上絞盡腦汁,而PaaS無疑會加速這個部署過程。它允許特性盡可能快的發(fā)布,同時也能讓開發(fā)者得到極大的滿足。這是個非常好的開始,給予開發(fā)者部署集維護(hù)自己軟件的工具,這將給工作積極性帶來很大的提高。同時,越來越多的開發(fā)者甚至不愿意加入沒有自動化軟件部署系統(tǒng)的公司。更少的領(lǐng)導(dǎo),更簡化的環(huán)節(jié),將給你帶來無與倫比的效率。

5. 如果使用Oracle或者M(jìn)ySQL,避免基于主鍵的查詢

只有在RAC中存在很少的Artifacts時,Oracle才能在流量高峰時獲得最佳性能。盡可能避免使用Referential Integrity、Triggers、Materialized Views、Views、Stored Procedures和其他的Oracle Artifacts。Triggers可以在從數(shù)據(jù)訪問層實現(xiàn)。Stored Procedures可以完全轉(zhuǎn)移到應(yīng)用層。數(shù)據(jù)庫只用來存儲數(shù)據(jù),基于字段進(jìn)行存儲而不是主鍵,使用類似Lucene的索引器做表的索引,使用一個允許在結(jié)果集上做基于其他字段的查詢,這將會返回這個記錄的主鍵,而這個主關(guān)鍵字可以進(jìn)一步被用來拿取記錄。

6. 考慮使用Oracle或者M(jìn)ySQL分片

當(dāng)schema達(dá)到臨界點,Oracle的可伸縮性將被限制,這里建議你對schema做基于功能(比如訂單,產(chǎn)品目錄,促銷活動,客戶等)上的分片,同時也為高密度表做key shards。為key shards使用一致性哈希,這樣當(dāng)一個新的RAC被添加RAC集時,你不再需要遍歷所有RAC中的鍵,以獲悉哪些鍵需要被移動到鍵的分片中。

7. 如果你使用Oracle做RDBMS,考慮使用Data Guard及Golden Gate

使用這兩種技術(shù)將大大簡化甲骨文的運營周期,Data Guard允許一個近實時passive讀副本(沒有客戶端會與之連接),而Golden Gate則允許一個近實時的active讀寫副本。

推薦的部署拓?fù)渲痪褪菫橥瑐€數(shù)據(jù)中心的每個分片配置1個Data Guard;使用Golden Gate來備份其他數(shù)據(jù)中心的每一個分片。

注意:Golden Gate只是近實時

8. 為Oracle或者M(jìn)ySQL添加數(shù)據(jù)訪問層

假設(shè)你有一個可以接受500個連接的Oracle RAC,而你有25個jBoss實例和這個甲骨文RAC對話,每個Jboss實例配置范圍10到50的數(shù)據(jù)庫連接池。

當(dāng)jBoss集群開啟時,連接到Oracle的數(shù)目為250(25乘10),一切運行良好。隨著流量快到j(luò)Boss集群的峰值,想象一下將會發(fā)生什么。在某個點后,Oracle將開始拒絕連接。

因此建議通過一個Multiplexer層建立一個Multiplexe應(yīng)用程序服務(wù)器連接。可以是一個簡單的 netty應(yīng)用,這個應(yīng)用運行在一個每個netty節(jié)點僅能夠與Oracle建立25個連接的集群上,但是對入站連接來者不拒。它會將所有的連接循環(huán)傳遞給Oracle,但是絕對不會超過25個,同時還使用Oracle JDBC驅(qū)動與Oracle通信。

9. 避免跨數(shù)據(jù)中心事務(wù)

當(dāng)下,這已經(jīng)是非常簡單的事情,但是在任何地方都非常適用,包括Oracle。在兩個數(shù)據(jù)不同數(shù)據(jù)中心,不要適用1個XA適配器去做跨數(shù)據(jù)中心事務(wù),這將導(dǎo)致相當(dāng)長時間的應(yīng)用線程阻塞,直到兩個階段的提交完成,因此將帶來你的應(yīng)用程序服務(wù)、服務(wù)和所有同步上傳流崩潰,最終會因為線程數(shù)量增加而導(dǎo)致整個應(yīng)用程序崩潰,比如在類似Black Friday流量情況下。

10. 考慮分布式緩存框架

Memcached、Counbase是最常用的選擇。但實際上,卸載非易失性數(shù)據(jù)到一個中心緩存集群上,確實沒必要在每個JVM上做相同的拷貝。但是確實需要設(shè)置小數(shù)量的JVM堆作為分布式緩存的一個MRU緩存,這樣的話,緩存集群本身將會受到非常少的網(wǎng)絡(luò)調(diào)用。

·在JVM上大多數(shù)分布式緩存支持本地緩存的概念,它將儲存最常用的對象。

·JVM上,GC的pause time同樣被最小化了,因為對象圖中需要遍歷的對象比以前更少了。

·Warmup過程是必不可少的,這可以幫助將數(shù)據(jù)導(dǎo)入分布式緩存,這個過程應(yīng)該在晚上或者是

11. 考慮把web應(yīng)用程序分解為服務(wù)

上帝保佑,如果你負(fù)責(zé)的web應(yīng)用程序超過50萬行代碼,而且仍然只作單一的項目部署,那么是時候根據(jù)服務(wù)功能把它分解成專業(yè)的服務(wù)了,并分配到不同的子組織或團(tuán)隊去操作。將Web應(yīng)用程序分解為服務(wù)有以下諸多優(yōu)勢:

·Debug將變得簡單

·擴展及讓子系統(tǒng)運行的更好將變得簡單

·很容易了解運行環(huán)境里發(fā)生了什么

·更快的添加新功能

12. 不要使用session stickiness

這絕是與魔鬼共舞,session stickiness會讓極值負(fù)荷下無法擴展。你的客戶端應(yīng)該能夠調(diào)用ANY應(yīng)用程序服務(wù)器,并得到其查詢值。其中一個方法是讓服務(wù)無狀態(tài),也稱為RestFUL服務(wù)。每個請求,客戶端會收發(fā)標(biāo)識狀態(tài)的id,代表客戶session的數(shù)據(jù)存儲在數(shù)據(jù)庫或跨多個請求的分布式緩存。

如果因為某個原因,取代RestFUL服務(wù),你網(wǎng)站大部分是建立在HttpServlets和HttpSession屬性上,使用以下方法可以實現(xiàn)獨立session stickiness的網(wǎng)站:

一個servlet過濾器面對每項服務(wù),取走每個請求的id,然后調(diào)用分布式緩存來填充會話屬性,這將有助于處理請求。因此數(shù)據(jù)中心任何服務(wù)器都可以響應(yīng)來自客戶端的請求,因為session狀態(tài)被保持在memcached。

不使用session stickiness還允許使用“rolling restart”方式重啟你的應(yīng)用程序服務(wù)器集群,從而實現(xiàn)100%的正常運行時間。

13. 終止反向代理商的SSL

在SSL信號交換及潛在TCP通信有效保持上,反向代理非常擅長。在反向代理有上設(shè)定一個顯式的TCP維持計時器,nGinx及許多其他http服務(wù)器都允許這么做,這允許TCP連接多次重復(fù)使用。與TCP信號交換的成本是3個network call,這樣許多請求就可以避免這個開銷。

因此從反向代理到應(yīng)用程序服務(wù)器,通常是RAW http;因此,同樣也要維持TCP的上行連接。

14. 為GSLB類型的負(fù)載平衡器使用粘性負(fù)載平衡

跨數(shù)據(jù)中心的負(fù)載平衡,建議使用session stickiness。這是因為在跨數(shù)據(jù)中心復(fù)制上,數(shù)據(jù)庫Oracle或Cassandra只能依賴最終一致性技術(shù)。因此,非粘性跨數(shù)據(jù)中心負(fù)載均衡器將使你的客戶端再也無法訪問網(wǎng)站。因此經(jīng)常使用GSLB,多數(shù)情況下,你的CDN將獲得基于位置的GSLB數(shù)據(jù)中心解決方案。

15. 減少主頁上的CNAME查找

盡量減少主頁上的CNAME查找。單單主頁的CNAME查找,一些網(wǎng)站就有10個或更多。即使客戶端DNS查找的答案可能來自他們的ISP遞歸緩存,我們?nèi)匀豢梢宰龅母?。www.amazon.com CNAME查找為零。

dig www.amazon.com  
;; QUESTION SECTION: 
;www.amazon.com. IN A 
;; ANSWER SECTION: 
www.amazon.com.28 IN A 205.251.242.54

16. 擁抱一切“reactor”

在高流量軟件系統(tǒng)中,reactor模式一次又一次的得以證明。一系列框架被創(chuàng)建用以實現(xiàn)reactor模式,reactor大致使用場景如下:

作為一個反向代理:nGinx

應(yīng)用程序服務(wù)器: node.js

并行處理的: Scala的actor model

除非你的業(yè)務(wù)邏輯是高度CPU綁定,否則就得考慮使用reactor模式或基于事件循環(huán)的軟件。如果無法實現(xiàn),可以考慮像RxJava框架那樣的響應(yīng)式編程模型。

17. 實現(xiàn)調(diào)用取消

從Siddharth Anand的一個會議上得到靈感,服務(wù)調(diào)用時的調(diào)用圖。首先,通過數(shù)字的遞減實現(xiàn)超時。接下來,服務(wù)調(diào)用圖的每次調(diào)用,都會創(chuàng)建一個UUID,并在分布式緩存中為UUID設(shè)置一個標(biāo)志:

UUID:true

如果服務(wù)調(diào)用圖中的任何服務(wù)超時,UUID的標(biāo)志設(shè)置為false。

現(xiàn)在為所有服務(wù)實現(xiàn)一個servlet過濾器,一直檢查這個標(biāo)志,只在這個標(biāo)志是真時才繼續(xù)處理。

如果標(biāo)志是是假,程序返回一個空的response。

這在大業(yè)務(wù)量時,可以禁止不必要的調(diào)用。

18. 執(zhí)行GC搜索協(xié)議

再次,靈感來自于同一個人——通過Netty讓所有的服務(wù)也顯示一個TCP端口。在調(diào)用一個服務(wù)之前,調(diào)用TCP端口然后暫停2 - 5 ms等待訪問。如果調(diào)用超時,這意味著這個Java進(jìn)程正字做一個“stop the world”的垃圾收集??蛻袅⒓辞袚Q到另一個服務(wù)實例,然后嘗試同樣的步驟。如果調(diào)用成功,然后調(diào)用實例上的實際服務(wù)。

注意:實現(xiàn)GC搜索協(xié)議需要的客戶端ip地址配置(即客戶端負(fù)載均衡)。

19. 盡可能讓業(yè)務(wù)邏輯和I / O存取異步進(jìn)行

在流量爆炸時,異步業(yè)務(wù)邏輯能讓您的應(yīng)用程序避免建立過多的線程。將事件隊列推送給負(fù)載均衡集群,讓它去做進(jìn)程訂閱的業(yè)務(wù)邏輯,而不是在http request/response周期線程做這些事。

20. 偏愛最終一致性數(shù)據(jù)庫

尤其是當(dāng)你在運行跨數(shù)據(jù)中心的應(yīng)用程序。除非你的用例是事務(wù)處理的(比如訂單)等等,否則偏愛使用最終一致性數(shù)據(jù)庫比如Cassandra,并盡可能少的使用ACID類型數(shù)據(jù)庫。

21. 使用CDN服務(wù)靜態(tài)內(nèi)容

使用CDN服務(wù)靜態(tài)內(nèi)容——javascript、圖像、css 等。CDN能有效地將靜態(tài)內(nèi)容復(fù)制到近客戶地方,因此許多針對這些靜態(tài)內(nèi)容的http請求最終穿越不會超過幾百英里。

22. 打包壓縮javascript到一個文件中

減少javascript內(nèi)聯(lián)。

注意:不要在pre-prod環(huán)境中這么做,這里需要使用調(diào)試程序做javascript的debug。

用戶訪問量低的時候。

原文鏈接: 22 Recommendations For Building Effective High Traffic Web Software

責(zé)任編輯:王程程 來源: High Scalability
相關(guān)推薦

2013-08-16 14:43:14

高性能移動Web移動Web站點移動Web

2013-09-10 17:13:57

移動網(wǎng)站性能優(yōu)化移動web

2018-09-28 04:46:19

負(fù)載均衡JavaLVS

2019-09-11 09:30:44

2010-04-22 09:18:23

2015-09-23 09:35:42

高性能高可靠塊存儲

2009-03-13 17:33:06

2021-05-27 10:02:57

Go緩存數(shù)據(jù)

2015-09-23 09:40:17

高性能Java應(yīng)用

2009-05-05 10:24:48

應(yīng)用架構(gòu)設(shè)計原則

2019-04-19 09:23:42

2011-02-23 09:49:40

ASP.NET

2011-07-10 00:29:18

PHP

2015-09-23 09:04:30

java高性能

2011-12-08 13:08:54

高性能路由

2017-09-18 01:21:05

美團(tuán)IDC集群銳捷網(wǎng)絡(luò)

2011-02-13 09:17:02

ASP.NET

2013-09-10 16:16:19

移動網(wǎng)站性能優(yōu)化移動web

2011-06-14 09:27:43

高性能WEB開發(fā)

2011-07-01 09:36:30

高性能Web
點贊
收藏

51CTO技術(shù)棧公眾號