Coherence Step by Step 篇 入门(一) 介绍(翻译)

2022-04-12 00:00:00 数据 分布式 缓存 服务 提供

这个章节提供了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)。

相关文章