
Infinispan网格缓存框架.doc
31页What is Infinispan_CN( 什 么 是Infinispan)版本 1 创建于: 2010-10-25 上午5:58 作者 jombo wang - 最后修改: 2010-10-28 上午4:52 作者 jombo wangInfinispan 是一个开源的数据网格平台.它对外发布了一个兼容 JSR-107 的 Cache 接口(该接口继承了 java.util.Map) ,你可以通过该接口来存储对象 Infinispan 可以以本地模式运行, 然而它的真正价值在于分布式模式,通过分布式模式可以将缓存集聚起来形成一个巨大的堆内存分布式模式相对于简单复制要强大的多,因为每个数据项分布在固定数目的节点上,因此使得服务器可以进行错误恢复,又由于存储一个数据项的工作量相对于集群的大小是恒定的,这使得服务器具备了可扩展性那么,为什么要选择 Infinispan·?Infinispan 具有以下特性 : 大容量堆内存和高可用性– 假设你有100个刀片服务器, 并且每个节点有2GB 的空间用于复制缓存,最终你获得的总数据量的大小为2GB. 每台服务器仅仅是一个拷贝相反,借助于分布式网格-假设你的每份数据只有一份拷贝- 你将获得100GB 的的备份虚拟堆内存,并且在网格中的任何位置都能访问。
如果某台服务器崩溃了, 网格只需要简单地创建一份丢失数据的新副本,并将它们放到另一台服务器上应用也无需再借助于一个巨大的独立数据库来获取数据以追求最大性能的 - 这是80% 以上的企业应用中的瓶颈所在! 扩展性– 由于数据是均匀分布的,所以除了考虑到网络上的组通讯,根本就没有必要来限制网格的大小 - 网络上的组通讯只要能够发现一个新的节点即可. 所有的数据获取方式都是通过点对点通信,即节点之间直接进行通信,非常容易控制 Infinispan 的增加或者减少不需要关闭整个服务 简单的添加删除集群中的机器不会引发任何服务中断 数据分布 – Infinispan 使用一致性哈希算法来决定集群中键值的存储位置 一致性哈希算法成本低,速度快并且最重要的是不需要额外的元数据或者网络通信就能确定键值的位置 数据分布的目的是为了在集群环境下保持足够的状态副本以使其具备可持续性和容错性,但是又不会有过多的副本而阻碍 Infinispan 的可扩展性 持久化– Infinispan 暴露了一个 CacheStore 接口和几个高性能的实现 - 包括 JDBC CacheStores, 基于文件系统的 CacheStores 以及 Amazon S3 CacheStores 等等. CacheStores 可以用于“ 热启动”, 或者用于确保重启整个表格时数据不丢失, 或者设置成当耗尽内存时能够将数据写到硬盘。
语言绑定 – (PHP, Python, Ruby, C, 等等.) - Infinispan 计划实现一个语言独立的服务器模块它既将会支持流行的的 memcached 协议(几乎是任何主流语言实现的)也会支持名称为 Hot Rod 的Infinispan 特定协议 . 这就意味着 Infinispan 不仅仅适用于 Java任何想要使用快速数据网格的主流站点或者应用都将可能选择 Infinispan 管理– 当你考虑在数百个服务器上运行这个表格时,管理就不再是额外的,它变成了一种必须管理多个分布在不同服务器上的 Infinispan 实例的首选方式是使用 JOPR ,JOPR 是 JBoss' 企业级管理解决方案由于 JOPR'的代理和自动发现特性,监控 Cache Manager 和 Cache 实例就变得非常简单 支持表格计算 – 路线图中还包括支持网格中运行可运行程序的能力 你将能够将复杂处理放到服务器,数据却是本地数据,然后获取数据map/reduce 模式在需要计算大量数据来获取少量结果的应用中是十分常见的Eviction Examples_CN( Eviction 示 例 )版本 2 创建于: 2011-1-11 上午11:13 作者 jombo wang - 最后修改: 2011-1-11 下午12:57 作者 jombo wang下面是关于 Eviction 和 Expiration 的注意点: Expiration 是一个顶层结构,可以通过配置或者 cache API 定义。
之后我们会有更多的阐述 Eviction 针对的是本地缓存实例,Expiration 针对的则是整个集群范围内的节点Expiration 的lifespan 和 maxIdle 的值会在缓存每个数据项间进行复制 Expiration 的 lifespan 和 maxIdle 的值会持久化到 CacheStores,所以这些信息也能够被eviction 或者 passivation 使用 Infinispan 包含了三种 eviction 策略, EvictionStrategy.NONE, EvictionStrategy.LRU和 EvictionStrategy.FIFO,并且这些都是最有用的如果需要,将来还会增加更多的策略 从 Infinispan 4.1版本开始, EvictionStrategy.UNORDERED 将会可用 从架构上讲,这些是完全新的实现配 置Eviction 可以通过 Configuration bean 或者 XML 文件的方式进行配置 Eviction 配置是基于单个缓存的 关于 Eviction 的有用配置元素包括:通过编程方式,可以达到同样的效果:configuration.setEvictionStrategy(EvictionStrategies.FIFO);configuration.setEvictionWakeupInterval(1000);configuration.setEvictionMaxEntries(2000);configuration.setExpirationLifespan(1000);configuration.setExpirationMaxIdle(500);默 认 值默认情况下,Eviction 是没有启用的。
如果启用了 Eviction (通过一个空白的 元素) ,将会使用一定的默认值: strategy: 如果没有指定策略,将会默认使用 EvictionStrategy.NONE wakeupInterval: 如果没有指定,默认值是5000o 如果你想要禁用 eviction 线程,可以设置 wakeupInterval 值为 -1 maxEntries: 如果没有指定,默认值是-1 ,意味着包含无限个数据项o 0 意味着没有数据项,eviction 将会一直使缓存为空Eviction 的 lifespan 和 maxIdle值默认为 -1Expiration 的 使 用你可以为缓存中的任意键值对设置一个 Expiration 的 lifespan和 maxIdle 的值它即可以像上面所说的那样通过配置设置成集群范围的,也可以使用 Cache 接口来定义键值对任何键值对定义的值都能够覆写该数据项在集群范围内的默认值例如使用下面的配置:// this entry will expire in 1000 milliscache.put("pinot noir", pinotNoirPrice);// this entry will expire in 2000 milliscache.put("chardonnay", chardonnayPrice, 2, TimeUnit.SECONDS);// this entry will expire 1000 millis after it is last accessedcache.put("pinot grigio", pinotGrigioPrice, -1, TimeUnit.SECONDS, 1, TimeUnit.SECONDS);// this entry will expire 1000 millis after it is last accessed, or// in 5000 millis, which ever triggers firstcache.put("riesling", rieslingPrice, 5, TimeUnit.SECONDS, 1, TimeUnit.SECONDS);Eviction 设 计Eviction 的核心是一个 EvictionManager 实例 。
如果配置了 Eviction 或者 Expiration,则这个实例是可用的EvictionManager的作用就是 eviction 线程 which periodically purges items from the DataContainer. 如果禁用了 eviction 线程( wakeupInterval设置为-1) ,eviction 可以通过调用 EvictionManager.processEviction()来手动启动,例如通过周期性的运行应用中的另一条维护线程eviction manager 是按照下面的方式来处理 evictions 的: 触发 Data Container 清除过期的数据项 触发 Cache Stores (如果存在的话 ) 清除过期数据项 调整 Data Container 的大小为指定值,该值的大小有 maxElements 属性决定DataContainerDataContainer 是缓存和 Eviction 的核心因此,使用哪种 DataContainer 接口的实现决定于是否启用了 eviction 和使用了哪种 eviction 策略。
DataContainer 提供了类似purgeExpired() 和 iterator()的方法,这些方法会在上述 步骤1 和步骤3由EvictionManager调用如果缓存不启用 Eviction,那么效率最高的 data container 实现就是SimpleDataContainerFIFOSimpleDataContainer 和 LRUSimpleDataContainer 实现会在排序上消耗一定的性能关于算法的细节可以参照实现的 JavadocsListeners and Notifications_CN(Listeners和 Notifications)版本 1 创建于: 2011-1-9 上午6:31 作者 jombo wang - 最后修改: 2011-1-9 上午7:04 作者 jombo wangInfinispan 提供了一个 listener API,通过该 API 客户端能够进行注册并且当事件发生时能后获取通知 这个注释驱动的 API 可以应用到两个不同的级别 : cache 事件级别和 cache manager 事件级别事件触发一个通知,这个通知将会被分发到对应 listeners。
Listeners 是简单的 POJOs,标记有 @Listener 注释并且通过 Listenable 接口中提供的方法进行注册Cache 和 CacheManager 都实现了 Listenable 接口,也就意味着你能够讲 listeners 注册到cache 或者 cache manager 上,以便能够获取 cache 级别或者 cache manager 级别的通知例如,下面的类定义了一个 listener, 每次数据项被添加到缓存时都会输出信息:@Listenerpublic class PrintWhenAdded {@CacheEntryCreatedpublic void pr。
