Coherence Step by Step 第一篇 入門(一) 介紹(翻譯)


 Coherence Step by Step 系列目錄

這個章節提供了Coherence概念和特性的一個快速預覽。指出了產品的性能,可用性,並且提供了如何實現一個特性的功能的詳細概述。這章要討論的東西貫穿了整個這個系列。

1.1 基本概念

這一節討論的話題描述了關於Coherence的基本觀念和討論幾個很重要的特性,關於使用Coherence來聚集數據。

 

1.1.1 集群數據管理

Coherence的核心就是集群數據管理。這暗示了下面幾個目標:

  • 完全一致性,一個系統鏡像(SSI,single system image)
  • 讀和寫的擴展性
  • 快速,透明的失效備援和失效回滾
  • 對存儲和處理的線性擴展
  • 沒有單點的故障(SPOFs, single points of falure)

基於這個基礎上構建是Coherence提供的各種各樣的服務,包括數據庫緩存,HTTP 會話管理,網格代理調用和分布式查詢。在進入關於這些特性的細節之前,先要討論下一些COherence基本的方面。

 

1.1.2 邏輯層的單獨的API,物理層的XML配置

Coherence為集群數據管理提供了許多拓撲結構。這些拓撲唉性能和容錯方面取了個平衡。使用一個單獨的API,拓撲的選擇可以延遲,直到部署的需要。這允許了開發人員用一個Coherence的始終一樣的邏輯視圖工作,在調試或者程序需要改變時提供了靈活性。

 

1.1.3 緩存策略

Coherence提供了多個緩存的實現。

  • 本地緩存-對於non-clustered緩存在本地的對上緩存
  • 復制式緩存-適合小的、只讀的緩存
  • 分布式緩存-對讀和寫的訪問是真正的線性可伸縮性。數據時自動的、動態的、透明的在節點中分布。分布式的算法使網絡流量最小化,避免了遞增的轉移數據造成服務的暫停。
  • Near Cache-提供了擁有分布式緩存的可擴展性的本地緩存。幾個不同的near-cache策略是可用的,提供了在性能和同步保證的折中的方案。

進程內緩存提供了最高等級的原生性能,因為對象是有本地JVM所管理。這最大的好處是通過本地,復制式的,樂觀的,和Near Cache的實現來直接實現。

進程外(Client/Server)緩存提供了使用專用的緩存服務器的選項。 這個能夠很有幫助,當你想分割工作負載(避免給服務器增加壓力)。這個可以通過分布式緩存的實現和通過使用一行命令行選項或者在xml配置中加一個條目來禁用客戶端節點上的本地存儲來自動完成。

分層的緩存(使用Near Cache 功能)使得你能夠將緩存服務器上的大的、分布式的緩存與應用服務器上的本地緩存結合起來,結合本地緩存的遠程的原生性能和分布式緩存的可擴展性。這對專用的緩存服務器和co-located caching(緩存分區存儲在應用服務器的JVMs上)都有幫助。

 

1.1.4 數據存儲選項

大多數的用戶受用堆上存儲結合專用的緩存服務器,Coherence對數據存儲有幾個選項:

  • On-heap-最快的選項,盡管它影響JVM的垃圾回收時間。
  • NIO RAM-對垃圾回收沒有影響,盡管它要求序列化和反序列化
  • NIO DISK-和NIO RAM箱子,但是使用內存映射文件。
  • File-based-使用一個disk-optimized存儲系統來優化素和和最小化I/O操作

Coherence 存儲是瞬時的,disk-based春初選項只針對管理緩存數據。對於持久化,Coherence提供了backing maps與CacheLoader/CacheStore結合。

 

1.1.5 序列化選項

因為序列化通常是集群數據管理中消費最大的,Coherence提供了下面的選項來序列化和反序列化數據:

  • com.tangosol.io.pof.PofSerializer-Portal Object Format (也可以引用POF)是一種和語言無關的二進制格式。POF的設計是用來在控件和時間上提高效率,在Coherence中是最常用的序列化選項。
  • java.io.Serializable 最簡單的,但是最慢的選項。
  • java.io.Externalizable-這要求開發人員手動實現序列化,但是能夠提供重大的性能提升。與java.io.Serizlizable比較,這個能夠用兩種或者兩種以上的因素截取序列化數據(在分布式緩存中特別有用,因為他們通常以序列化形式緩存數據)。最重要的,CPU使用率顯著的降低。
  • com.tangosol.io.ExternalizableLite-這和java.io.Externalizable十分相似,但是提供了更好的性能和更低的內存利用率,通過使用了一個更加高效的IO stream的實現。
  • com.tangosol.run.xml.XmlBean-ExternalizableLite的默認實現。

1.1.6 可配置性和可擴展性

Coherence的API提供了訪問所有的Coherence功能。最常用的API的子集通過簡單的xml選項來暴露出去,以最大程度的讓常用用例的簡單化。對於混合通過API直接配置和簡單的xml配置沒有什么還出。

Coherence的設計允許更具需要來替換它的模塊。例如,本地的"backing maps"(它提供了在每個節點上真實的物理存儲)能夠根據需要簡單的替換。絕大多數的事件,這是不需要的,但是確實存在某些情況需要它。一般的指南是80%的任務是簡單的,剩余的20%的任務(特例)需要一點點努力,但是一定是不用能夠完成,不會有很大的困難。

 

1.1.7 命名空間的層次

Coherence被組織為一組服務。最上層是Cluster服務。每個Cluster定義了一組Coherence實例(每個JVM一個實例,每台計算機有一個或多個JVM)。Cluster定義為由多播地址和端口號組成。TTL(網絡數據包存活時間;網絡的跳數)設置能夠限制cluster到達一台計算機,或者計算機連接一個交換機。

在cluster服務下面是各種包含了Coherence API的服務。這些包含了各種緩存服務(復制式的,分布式的,等等)和調用服務(給cluster的各個節點部署代理)。每個服務的是咧是被命名的,並且通常每個類型都有一個默認的服務實例。

緩存服務包含了named caches(com.tangosol.net.NamedCache),類似於數據庫的表,他們通常包含了一組關系對象。

 

1.2 讀/寫緩存

 

1.2.1 NamedCache

下面的源代碼返回了一個NamedCache實例的引用。如果需要,基礎的緩存服務可以啟動。

import com.tangosol.net.*;
...
NamedCache cache = CacheFactory.getCache("MyCache");

Coherence掃描配置文件,尋找名為MyCache的映射。這個很想在web container里的web.xml文件中的Servlet名映射。Coherence的緩存配置文件包含(在最簡單的例子中)了一組映射(從緩存名導緩存方案)和一組緩存方案。

默認的,Coherence使用在coherence.jar中發現的coherence-cache-config.xml文件。這個能夠使用JVM 命令行的-Dtangosol.coherence.cacheconfig=file.xml來覆蓋。這個參數能夠引用文件系統路徑或者是java資源路徑。

com.tangosol.net.NamedCache 接口擴展幾個其他的接口

  • java.util.Map--基本的映射方法,如get(),put(),remove()。
  • com.tangoso.util.ObervableMap--監聽緩存時間的方法
  • com.tangosol.net.cache.CacheMap--獲取緩存中的一組鍵的集合和把對象放進緩存的方法。也支持添加一個會到期的值,當存一個條目進緩存時。
  • com.tangoso.util.QueryMap--查詢緩存的方法
  • com.tangosol.util.ConcurrentMap--並發訪問的方法,如lock()和unlock()。
  • com.tangosol.util.InvocableMap--服務端處理緩存數據的方法。

1.2.2 被緩存對象的需求

緩存鍵和值必須序列化(例如,java.io.Serializable)。此外,緩存建必須提供hashCode()和equals()方法的實現,這些方法必須在cluster節點間返回一致的結果。這表示了hashCode()和equals()必須單獨的機遇對象序列化狀態(就是說,對象的non-transient 字段);多數的java內建的類型,如string,Integer和Date,滿足這種需求。一些緩存的實現(尤其是分布式緩存)對平等測試使用了關鍵對象的序列化形式,那意味着equals()返回true的鍵必須同樣的序列化;java內建的類型也滿足了需求。

 

1.2.3 NamedCache使用模式

有兩種通常的方法來使用NamedCache:

  • java.util.Map的cluster實現,使用了幾個附加的特性(查詢和並發),但是沒有永久的backing(a "side" cache 單方面緩存)
  • 離線訪問外部的數據源(an "inline" cache內聯緩存)。既然這樣,應用程序使用NamedCache接口,NamedCache小型的管理基礎數據庫(或者其他的資源)

通常,一個內聯的數據庫用來從下面幾個地方緩存數據:

  • 數據庫--最直觀的使用緩存--簡單的緩存數據庫表(以java對象的形式)
  • 服務--大型機,web服務,服務單元--任何一個昂貴的資源訪問(不論是出於計算成本或實際接入費用)。
  • 運算--金融計算,聚合,數據轉換。使用inline緩存讓這些變得簡單,避免了重復計算。如果計算完成,結果只是從緩存里拉取。既然任何序列化對象能被用來作為緩存建,這是一個簡單的事情,用包含計算參數的對象作為緩存建。

Write-back選項

  • Write-through--確保外部數據源總是包含了最新的信息。當需要立即持久化,或者和其他應用程序共享一個數據源,使用這個。
  • write-behind--提供了更好的性能,通過緩存寫的數據到外部的數據源。不僅僅是寫的數據能緩沖到數據源的負載上,而且能合並多個寫的數據,更多的降低I/O。平衡的是數據不會立即持久化到磁盤;然而,會被立即通過cluster分發,數據會存在其它服務器上。此外,如果整個數據及被緩存了,這個選項意味着應用程序能夠臨時的存活一個完全失效的數據源,讀和寫此時都不需要同步訪問數據源。

實現一個制度的內聯緩存,你只要簡單在com.tangosol.net.chache.CacheLoader接口上實現兩個方法,一個是單個的讀取,另一個批量的讀取。Coherence提供了一個抽象類com.tangosol.net.chache.AbstractCacheLoader,它提供了默認的批量讀的實現,這意味着你只需要實現一個單一的方法public Object load(Object key)。這個方法接受一個任意的緩存鍵,並返回對應的值對象。

如果你希望實現讀寫緩存,你必須擴展com.tangosol.net.cache.AbstractCacheStore(或者實現接口com.tangosol.net.cache.CacheStore),它增加下面的方法

public void erase(Object oKey);
public void eraseAll(Collection colKeys);
public void store(Object oKey, Object oValue);
public void storeAll(Map mapEntries);

方法erase() 應該從外部的數據源移除指定的鍵。store()方法更新了數據源中指定項,如果存在,如果不存在,就插入。
在CacheLoader/CacheStore實現后,可以通過coherence-cache-config.xml文件來連接。

1.3 緩存查詢
Coherence提供了查詢緩存數據的功能。分布式緩存中,查詢是索引的和並發的,這就是說給分布式緩存增加服務器,不僅增加了吞吐量(美妙的全部查詢),而且減少了延遲,查詢所用的時間減少了。對NamedCache進行查詢,所有的對象應該實現一個通用的接口(或者基類)。對象的任何字段都能查詢;索引是可選的,並且用來提升性能。復制式的緩存中,查詢是在本地執行的,不用索引。
給NamedCache增加一個索引,你首先需要一個值提取器(它能夠接受輸入一個值對象,返回對象的屬性)。索引可以盲目的添加(多個索引會被忽略)。索引可以在任何時間添加,在插入數據到緩存之前或之后。
應該注意的是,查詢只是用緩存的數據。基於這個原因,除非整個數據及被加載到了緩存中,要不然不要使用查詢,除非附加的支持被添加了來管理部分加載設置。
開發者可以選擇實現附加的自定義過濾器來查詢,利用查詢的並發行為。對於特別的性能敏感的查詢,開發者可以實現有索引的過濾器,這個優化既有效又搞笑。不需要維護。

1.4 事務
Coherence提供了各種事務選項。選項包括:基本數據並發,使用ConcurrentMap接口和EntryProcessorAPI,原子事務使用了事務框架API,並且原子事務完全支持XA,使用Coherence資源適配器。

1.5 HTTP回話管理器
Coherence×Web 是一個HTTP會員管理器模塊,
支持大范圍的應用服務器。
使用Coherence回話管理器不需要程序做任何改變。Coherence×Web使用NearCache技術,提供完全容錯的緩存,擁有幾乎沒有限制的可擴展性(為幾百個cluster節點服務沒有問題)。

1.6 Invocation服務
Coherence調用服務能夠部署運算代理到各個cluster的節點。這些代理既可以是excute-style(部署和異步監聽)有可以是query-style(部署和同步監聽)。
調用服務能夠通過com.tangosol.net.InvocationService接口來訪問,包含以下兩個方法:

public void execute(Invocable task, Set setMembers, InvocationObserver observer);
public Map query(Invocable task, Set setMembers);
服務的實例可以從com.tangosol.net.CacheFactory 類來檢索。
Coherence為以人物為中心的處理實現WorkManager API。

1.7 事件
所有的NamedCache實例實現了com.tangosol.util.ObservableMap接口,允許選擇附加一個緩存建挺起的實現。(com.tangosol.util.MapListener)。應該注意的是,應用程序能夠監聽事件,是邏輯上的觀察,無論哪台計算機引發了時間。自定義的基於服務器的過濾器和輕量級的時間,能夠最小化網絡流量和進程。緩存建挺起跟隨着JavaBean范式,能夠區別系統緩存時間(如逐出)和應用程序緩存時間(如get/put操作)。
Continuous Query功能提供了維護客戶端
"materialized view"的功能。相似的,任何服務能夠觀察到成員的加入,離開,包括cluster服務和緩存和調用服務。

 

1.8 關系對象映射集成
多數的ORM產品支持Coherence作惡日一個二級緩存插入。這些解決方案緩存實習對象到Coherence,允許應用程序在多個服務器上共享數據。


1.9 C++/.NET集成
Coherence提供了對交叉平台客戶端(基於TCP/IP)的支持。所有的客戶端使用同樣的寫協議(服務器不區分客戶端平台)。同樣,注意在這些客戶端里沒有任何第三方的組件(如內嵌的JVM或者語言橋梁)。寫協議支持事件訂閱和對所有客戶端平台的一致的進程內緩存。


1.10 管理和監聽
Coherence提供了管理和監聽的功能,通過Java Management Extensions(JMX)。


免責聲明!

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



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