Coherence是什么
Coherence是Oracle為了建立一種高可靠和高擴(kuò)展集群計(jì)算的一個(gè)關(guān)鍵部件,集群指的是多于一個(gè)應(yīng)用服務(wù)器參與到運(yùn)算里。Coherence的主要用途是共享一個(gè)應(yīng)用的對象(主要是java對象,比如Web應(yīng)用的一個(gè)會話java對象)和數(shù)據(jù)(比如數(shù)據(jù)庫數(shù)據(jù),通過OR-MAPPING后成為Java對象)。
簡單來說,就是當(dāng)一個(gè)應(yīng)用把它的對象或數(shù)據(jù)托管給Coherence管理的時(shí)候,該對象或數(shù)據(jù)就能夠在整個(gè)集群環(huán)境(多個(gè)應(yīng)用服務(wù)器節(jié)點(diǎn))共享,應(yīng)用程序可以非常簡單地調(diào)用get方法取得該對象,并且由于Coherence本身的冗余機(jī)制使得任何一個(gè)應(yīng)用服務(wù)器節(jié)點(diǎn)的失敗都不會影響到該對象的丟失。其實(shí)如果不使用coherence,對于一個(gè)會話在多個(gè)應(yīng)用服務(wù)器節(jié)點(diǎn)的共享一般是通過應(yīng)用服務(wù)器本身的集群技術(shù),而Coherence的創(chuàng)造者則認(rèn)為基于某種應(yīng)用服務(wù)器技術(shù)的集群技術(shù)來共享會話變量的技術(shù)并不完整,而專門開發(fā)出Coherence這個(gè)產(chǎn)品(原來稱為tangosol)并且最后被Oracle收購,這個(gè)產(chǎn)品既有原來各種應(yīng)用服務(wù)器集群所具有的各種技術(shù)特點(diǎn),而且又增加了原來各種應(yīng)用服務(wù)器集群技術(shù)所沒有的各種特性。
要學(xué)習(xí)這個(gè)產(chǎn)品,需要記住并注意的一點(diǎn)是:Coherence所有的設(shè)計(jì)都是基于多個(gè)(可以是非常多)的JVM,很多Coherence的測試都是使用幾十甚至上百個(gè)節(jié)點(diǎn)來進(jìn)行的。
Coherence的一些技術(shù)特點(diǎn)
Coherence產(chǎn)品首先是被設(shè)計(jì)用于高擴(kuò)展性:
所謂高擴(kuò)展性就是當(dāng)一個(gè)應(yīng)用服務(wù)器能夠處理2000筆交易,則10個(gè)應(yīng)用服務(wù)器應(yīng)該能夠處理20000筆交易。
一般而言,整個(gè)應(yīng)用架構(gòu)的擴(kuò)展性由架構(gòu)里的最不能擴(kuò)展的部位(稱之為瓶頸)決定,這個(gè)瓶頸一般而言都是數(shù)據(jù)源的處理,Coherence針對這種理解提供了應(yīng)用層的數(shù)據(jù)共享緩沖,任何一個(gè)時(shí)候如果應(yīng)用能夠從這個(gè)數(shù)據(jù)緩沖里滿足要求,則不會將請求發(fā)給數(shù)據(jù)源,從而極大地增強(qiáng)一般的瓶頸(數(shù)據(jù))的擴(kuò)展性。
為了加強(qiáng)數(shù)據(jù)的寫處理性能,Coherence還設(shè)計(jì)了延遲寫的功能,就是應(yīng)用的寫會先緩存在Coherence的緩沖區(qū),然后延遲寫到數(shù)據(jù)庫里,為了減輕數(shù)據(jù)源的寫壓力,Coherence只把最近的更改寫到數(shù)據(jù)源,比如一條數(shù)據(jù)被更改了多遍,則只有最后的更改會被提交到數(shù)據(jù)源。而且,如果可能,多個(gè)SQL語句會被變成一個(gè)SQL語句批,一次提交給數(shù)據(jù)源,這樣又極大地降低了對數(shù)據(jù)源的壓力。
熟悉于數(shù)據(jù)庫應(yīng)用程序,參加過性能測試的有經(jīng)驗(yàn)的朋友應(yīng)該知道這非常多的場合,上述Coherence的特點(diǎn)剛好是對應(yīng)了非常多的經(jīng)常遇到的應(yīng)用出現(xiàn)問題的場景。
即Coherence被放在應(yīng)用服務(wù)器和數(shù)據(jù)庫服務(wù)器之間,從而解決通常應(yīng)用架構(gòu)里的瓶頸(數(shù)據(jù)瓶頸)來提高整個(gè)應(yīng)用架構(gòu)的可擴(kuò)展性。
Coherence的第二個(gè)非常重要的特地是支持?jǐn)?shù)據(jù)的分區(qū)處理,就是如果有N個(gè)處理節(jié)點(diǎn),則每個(gè)節(jié)點(diǎn)只管理1/N的數(shù)據(jù),當(dāng)一個(gè)節(jié)點(diǎn)失效時(shí),該節(jié)點(diǎn)的數(shù)據(jù)會在剩下的節(jié)點(diǎn)均分,每個(gè)節(jié)點(diǎn)將管理1/(N-1)的數(shù)據(jù)。同樣的,當(dāng)一個(gè)節(jié)點(diǎn)增加進(jìn)來時(shí),則每一個(gè)節(jié)點(diǎn)都會分配一部分?jǐn)?shù)據(jù)給新的節(jié)點(diǎn),則最終每個(gè)節(jié)點(diǎn)只管理1/(N+1)的數(shù)據(jù)。大家知道,一般應(yīng)用服務(wù)器的集群都有只能緩沖共享2G java對象的缺點(diǎn),而Coherence這種設(shè)計(jì)讓Coherence能夠處理非常多的數(shù)據(jù),只需要通過增加節(jié)點(diǎn)的數(shù)量,就可以處理更多的數(shù)據(jù)。
如果安裝了Coherence,則應(yīng)用服務(wù)器不需要配置專有的服務(wù)器集群技術(shù),因?yàn)镃oherence*web模塊提供了可用于處理http會話信息在Coherence集群內(nèi)共享的功能,當(dāng)一個(gè)節(jié)點(diǎn)需要讀取HTTP會話信息而發(fā)現(xiàn)自己沒有該會話信息的時(shí)候,它會把請求同時(shí)發(fā)給所有的節(jié)點(diǎn)(multicast),而當(dāng)一個(gè)節(jié)點(diǎn)需要寫HTTP會話信息的同時(shí),它也會把寫請求發(fā)給所有的節(jié)點(diǎn),所以2個(gè)節(jié)點(diǎn)的處理和100個(gè)節(jié)點(diǎn)的處理都是一樣的。
1. Caching:正如Coherence的別名是Data Grid,Coherence在這種場景主要是被用于緩存數(shù)據(jù)源的數(shù)據(jù),當(dāng)應(yīng)用需要數(shù)據(jù)時(shí),直接從Coherence里面取得而不是從后臺數(shù)據(jù)源取得。比如用于緩存用戶的個(gè)人設(shè)置信息。這種使用方式可以極大降低對后臺數(shù)據(jù)源的壓力,并且甚至當(dāng)后臺數(shù)據(jù)源不可用的時(shí)候也不影響系統(tǒng)的可用性。
2. Analytics:用于查詢,從簡單查詢到復(fù)雜查詢,比如用于查詢金融交易系統(tǒng)的投資者持倉信息(非常密集的查詢)。這種使用方式還可以使用多個(gè)節(jié)點(diǎn)的并發(fā)查詢。
3. Transactions:在Coherence直接處理交易,可以在Coherence直接提交交易,從而得到極快的響應(yīng)速度和高可擴(kuò)展性。
4. Events:Coherence里可以使用事件驅(qū)動的架構(gòu),能夠?qū)κ录龀鰧?shí)時(shí)的處理。比如在線游戲使用EDA架構(gòu)處理“武器”,“裝備”的買賣交易。