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

一步一步理解Java 企業(yè)級(jí)應(yīng)用的可擴(kuò)展性

開發(fā) 后端
本文主要介紹如何理解 Java 應(yīng)用的擴(kuò)展方式以及不同類型的擴(kuò)展技術(shù)和具體技巧,介紹一些有關(guān) Java 企業(yè)級(jí)應(yīng)用的一般擴(kuò)展策略。

老實(shí)說(shuō),“可擴(kuò)展性”是個(gè)全面且詳盡的話題,而且往往得不到充分理解。人們通常認(rèn)為可擴(kuò)展性等同于高可用性,筆者見過(guò)編程新手和架構(gòu)師“老手”都建 議將集群作為可擴(kuò)展性和高可用性的解決方案。建議確實(shí)沒錯(cuò),但問題是,人們通常是通過(guò)互聯(lián)網(wǎng)搜索,而非實(shí)際理解應(yīng)用本身的情況來(lái)實(shí)現(xiàn)集群。

筆者并未自稱“專家”,只想通過(guò)這篇文章介紹一些有關(guān) Java 企業(yè)級(jí)應(yīng)用的一般擴(kuò)展策略。

問題

可擴(kuò)展性并非 Java 企業(yè)級(jí)平臺(tái)規(guī)范內(nèi)的標(biāo)準(zhǔn)組件。相關(guān)技術(shù)通常因供應(yīng)商(應(yīng)用服務(wù)器)而異,并且往往需要使用不止一款產(chǎn)品(應(yīng)用服務(wù)器本身除外)。正因如此,設(shè)計(jì)可擴(kuò)展的 Java 企業(yè)級(jí)應(yīng)用才會(huì)有些棘手,要完成任務(wù),往往不僅沒有可以參照的實(shí)例,而且要求我們必須徹徹底底地理解應(yīng)用。

擴(kuò)展類型

筆者確信你們不是***次看到這些內(nèi)容。擴(kuò)展一般分為兩大類:縱向擴(kuò)展,和橫向擴(kuò)展。

擴(kuò)展的***個(gè)自然階段是縱向擴(kuò)展。

  • 縱向擴(kuò)展:包括給服務(wù)器增加更多資源,例如內(nèi)存 (RAM)、磁盤空間、處理器等。這在某些方案中具備實(shí)用價(jià)值,但經(jīng)過(guò)特定時(shí)間點(diǎn)后就會(huì)發(fā)現(xiàn),這種擴(kuò)展費(fèi)用高昂,不如借助橫向擴(kuò)展。

  • 橫向擴(kuò)展:在這個(gè)過(guò)程中會(huì)增加更多機(jī)器或額外的服務(wù)器實(shí)例/節(jié)點(diǎn),這也叫做集群(Clustering),因?yàn)樗蟹?wù)器是作為一個(gè)集體或集群一起運(yùn)行的。

高可用性不等于可擴(kuò)展性

系統(tǒng)高度可用(擁有多個(gè)服務(wù)器節(jié)點(diǎn)以方便故障轉(zhuǎn)移),并不表示系統(tǒng)可擴(kuò)展。高可用性只是意味著,如果當(dāng)前處理節(jié)點(diǎn)崩潰,請(qǐng)求會(huì)傳遞或轉(zhuǎn)移到集群中的 另一個(gè)節(jié)點(diǎn),以便從開始處繼續(xù)??蓴U(kuò)展性則是通過(guò)增加可用資源(內(nèi)存、處理器等)而提升系統(tǒng)特定性能(例如用戶數(shù)量、吞吐量、響應(yīng)時(shí)間)的能力,即使將失 敗請(qǐng)求傳遞到另一個(gè)節(jié)點(diǎn),也無(wú)法保證應(yīng)用會(huì)在這種場(chǎng)景中正確運(yùn)行(原因我們會(huì)在下面揭曉)。

下面我們來(lái)了解一些關(guān)于可擴(kuò)展性的觀點(diǎn)和相關(guān)討論。

讓橫向擴(kuò)展的集群達(dá)到負(fù)載均衡

假設(shè)您已經(jīng)縱向擴(kuò)展至***容量,現(xiàn)在又用多個(gè)節(jié)點(diǎn)形成集群,將系統(tǒng)進(jìn)行了橫向擴(kuò)展。接下來(lái)您要做的可能是在集群基礎(chǔ)架構(gòu)前放置一臺(tái)負(fù)載均衡器,讓負(fù)載分散在集群各部分之間(如果要詳細(xì)了解負(fù)載均衡,大家可以參考其他方面的資料,在這里我們重點(diǎn)還是說(shuō)擴(kuò)展問題)。

一步一步理解 Java 企業(yè)級(jí)應(yīng)用的可擴(kuò)展性

應(yīng)用有狀態(tài)還是無(wú)狀態(tài)?

現(xiàn)在你已經(jīng)橫向擴(kuò)展了,這就夠了嗎?如果你的應(yīng)用無(wú)狀態(tài),即應(yīng)用邏輯在處理請(qǐng)求時(shí)不依靠現(xiàn)有服務(wù)器狀態(tài),則橫向擴(kuò)展已經(jīng)足夠。

但如果應(yīng)用具有 HTTP 會(huì)話對(duì)象、有狀態(tài) EJB、會(huì)話域 bean (CDI、JSF) 等組件時(shí),又會(huì)怎樣?這取決于具體客戶(具體來(lái)說(shuō),即調(diào)用線程),存儲(chǔ)特定狀態(tài)并依靠當(dāng)前顯示的狀態(tài)來(lái)執(zhí)行請(qǐng)求(例如,HTTP 會(huì)話對(duì)象可能會(huì)存儲(chǔ)用戶的身份驗(yàn)證狀態(tài)、購(gòu)物車信息等)。

在橫向擴(kuò)展或集群式應(yīng)用中,節(jié)點(diǎn)的任何集群都可能為后續(xù)請(qǐng)求提供服務(wù)。如果***請(qǐng)求的 JVM 實(shí)例處的狀態(tài)數(shù)據(jù)沒有被接收,其他節(jié)點(diǎn)會(huì)如何處理請(qǐng)求?

一步一步理解 Java 企業(yè)級(jí)應(yīng)用的可擴(kuò)展性

一步一步理解 Java 企業(yè)級(jí)應(yīng)用的可擴(kuò)展性

會(huì)話保持

會(huì)話保持配置可在負(fù)載均衡器層面上完成,確保來(lái)自特定客戶/終端用戶的請(qǐng)求始終被轉(zhuǎn)發(fā)到同一個(gè)實(shí)例/應(yīng)用服務(wù)器節(jié)點(diǎn),即維持服務(wù)器親和力。這樣,我 們就緩解了所需狀態(tài)無(wú)法顯示的問題。但這里有個(gè)陷阱 – 如果節(jié)點(diǎn)崩潰怎么辦?狀態(tài)會(huì)被破壞,用戶會(huì)被轉(zhuǎn)至服務(wù)器請(qǐng)求處理所依賴的、但不具備現(xiàn)有狀態(tài)的實(shí)例。

一步一步理解 Java 企業(yè)級(jí)應(yīng)用的可擴(kuò)展性

一步一步理解 Java 企業(yè)級(jí)應(yīng)用的可擴(kuò)展性

集群復(fù)制

為解決上述問題,您可對(duì)應(yīng)用服務(wù)器集群機(jī)制進(jìn)行配置,以支持有狀態(tài)組件的復(fù)制,借此可確保 HTTP 會(huì)話數(shù)據(jù)(和其他有狀態(tài)對(duì)象)顯示在所有服務(wù)器實(shí)例上。如此一來(lái),終端用戶請(qǐng)求便可轉(zhuǎn)至任何服務(wù)器節(jié)點(diǎn),即使某個(gè)服務(wù)器實(shí)例崩潰或不可用,集群中的其他任 何節(jié)點(diǎn)都能夠處理請(qǐng)求?,F(xiàn)在您的集群就不是一般集群了,而是復(fù)制集群。

一步一步理解 Java 企業(yè)級(jí)應(yīng)用的可擴(kuò)展性

集群復(fù)制特定于 Java 企業(yè)級(jí)容器/應(yīng)用服務(wù)器,***查閱相關(guān)文檔,了解如何復(fù)制集群。一般而言,大多數(shù)應(yīng)用服務(wù)都支持 Java 企業(yè)級(jí)組件(如有狀態(tài)和無(wú)狀態(tài)的 EJB、HTTP 會(huì)話、JMS 隊(duì)列等)集群。

然而這造成了另一個(gè)問題 – 應(yīng)用服務(wù)器中的每一個(gè)節(jié)點(diǎn)都處理會(huì)話數(shù)據(jù),導(dǎo)致 JVM 堆內(nèi)存越來(lái)越多,因此垃圾回收也越來(lái)越頻繁,另外,復(fù)制集群時(shí)還會(huì)消耗一定的處理能力。

有狀態(tài)組件的外部存儲(chǔ)

在另一層存儲(chǔ)會(huì)話數(shù)據(jù)和有狀態(tài)的對(duì)象,這可以借助 RDBMS 實(shí)現(xiàn),大多數(shù)應(yīng)用服務(wù)器本身就支持這一功能。

一步一步理解 Java 企業(yè)級(jí)應(yīng)用的可擴(kuò)展性

你可能已經(jīng)注意到了,我們已經(jīng)將存儲(chǔ)從內(nèi)存層轉(zhuǎn)移到持久層 – 一天工作結(jié)束時(shí),你可能會(huì)遇到由數(shù)據(jù)庫(kù)導(dǎo)致的擴(kuò)展問題。不是說(shuō)這一定會(huì)發(fā)生,但數(shù)據(jù)庫(kù)確實(shí)可能因?yàn)閼?yīng)用而過(guò)載,而后逐漸延時(shí)(例如在故障轉(zhuǎn)移時(shí))。設(shè)想一 下,從數(shù)據(jù)庫(kù)中再現(xiàn)整個(gè)用戶會(huì)話狀態(tài)以便用在另一個(gè)集群實(shí)例中,不僅耗費(fèi)大量時(shí)間,還會(huì)影響峰值負(fù)載下的終端用戶體驗(yàn)。

***的邊界:分布式內(nèi)存中緩存

這是***的邊界,至少在我看來(lái)如此,因?yàn)樗盐覀儙Щ亓藘?nèi)存方法。沒有比這更好的辦法了!Oracle Coherence、Hazelcast 這類產(chǎn)品或其他任何分布式緩存/內(nèi)存網(wǎng)格產(chǎn)品可用于清理有狀態(tài)的狀態(tài)存儲(chǔ)和復(fù)制/分布 – 這就是緩存層。好的一面是這些產(chǎn)品大多默認(rèn)支持 HTTP 會(huì)話存儲(chǔ)。

一步一步理解 Java 企業(yè)級(jí)應(yīng)用的可擴(kuò)展性

這種結(jié)構(gòu)設(shè)置意味著,應(yīng)用服務(wù)器的重啟不會(huì)影響現(xiàn)有用戶會(huì)話 – 給系統(tǒng)打補(bǔ)丁而不造成宕機(jī)和終端用戶斷電(雖然并不像聽上去那么容易,但顯然是個(gè)辦法!),這始終是好事??偟膩?lái)說(shuō),其理念是:應(yīng)用層和 web 會(huì)話緩存層可獨(dú)立運(yùn)行和擴(kuò)展,彼此不受干擾。

分布式不等于重復(fù)式

這兩個(gè)詞之間存在巨大差異,就緩存層而言,理解其中的差異是極為關(guān)鍵的。兩者各有長(zhǎng)短:

  • 分布式:緩存共享數(shù)據(jù)的各個(gè)部分,即數(shù)據(jù)集被分在各緩存集群節(jié)點(diǎn)之間(利用與產(chǎn)品特定的算法)。

  • 重復(fù)式:所有緩存節(jié)點(diǎn)都擁有所有數(shù)據(jù),即每個(gè)緩存服務(wù)器都包含整個(gè)數(shù)據(jù)集的一份復(fù)本。

延伸閱讀(主要關(guān)于 Weblogic)

結(jié)束語(yǔ)

  • 高度可擴(kuò)展性可能不是所有 Java 企業(yè)級(jí)應(yīng)用的必要條件。但如果你打算構(gòu)建互聯(lián)網(wǎng)/面向大眾的應(yīng)用,將高可擴(kuò)展性納入設(shè)計(jì)因素顯然非常實(shí)用。

  • 對(duì)于希望充分利用自動(dòng)靈活性(經(jīng)濟(jì)可行?。┖透呖捎眯缘仍破脚_(tái)(主要是PaaS)特點(diǎn)的應(yīng)用而言,可擴(kuò)展的設(shè)計(jì)是必要的。

  • 不難發(fā)現(xiàn),有狀態(tài)的應(yīng)用通常更難以擴(kuò)展。完全「無(wú)狀態(tài)」或許無(wú)法實(shí)現(xiàn),但我們應(yīng)當(dāng)朝這方面努力。

你用哪些技巧和方法來(lái)擴(kuò)展 Java 企業(yè)級(jí)應(yīng)用,快來(lái)和大家分享吧。

責(zé)任編輯:王雪燕 來(lái)源: oneapm
相關(guān)推薦

2022-09-30 15:37:19

Web網(wǎng)站服務(wù)器

2022-08-29 15:19:09

CSS煙花動(dòng)畫

2009-07-06 19:29:37

云計(jì)算私有云服務(wù)器虛擬化

2010-07-12 17:10:23

Android應(yīng)用程序

2013-03-18 16:09:27

JavaEEOpenfire

2012-03-22 10:33:33

思杰XenDesktop

2011-06-07 16:03:48

匿名SQL Server

2018-03-07 15:24:41

PythonMySQL

2017-08-24 08:31:41

2019-11-04 10:06:19

MySQL索引

2017-11-29 11:14:52

離線緩存URL協(xié)議緩存

2017-09-28 09:40:36

圖像分類準(zhǔn)確率

2009-12-18 16:27:43

Cisco路由器配置

2025-04-08 09:30:00

SeataDocker分布式系統(tǒng)

2017-07-15 21:10:58

CTOCEO技術(shù)

2024-07-22 11:43:28

LVMPnetLab網(wǎng)絡(luò)

2009-12-17 08:57:28

Windows 7磁盤分區(qū)

2017-09-13 09:05:29

iOS11iOS蘋果

2010-01-29 09:54:55

林昊Java模塊化OSGi
點(diǎn)贊
收藏

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