前几天Oracle发布了WebLogic Server 10.3.4,这一版中加入了很多非常不错的新特性,其中之一就是ActiveCache。那么什么是ActiveCache,我们可以用它来做什么?我想就此问题谈谈自己的一点学习心得。
ActiveCache通俗来讲就是WLS+Coherence,都不是新东西,这是否有点瓶装旧酒的意思。可以这么说,但又不完全对,ActiveCache更象是WLS与Coherence之间的Glue,让WLS与Coherence结合的更加平滑与自然。从另一个角度来说,Coherence这个东东应用场景非常广,以前给客户讲Coherence时,客户总是感觉无从下手。而ActiveCache的出现明确了指明了两个应用方向:会话共享内存与应用共享内存。
为什么会话共享内存?
其实早在应用服务器集群横行的年代,共享内存或内存复制技术早已由应用服务器产品实现,这里面的优秀代表就是WebLogic Server。但是随着应用服务器集群的广泛使用,问题也接踵而至:
1. 应用服务器与应用内存争用
我们知道,每个JVM所能够使用的堆内存空间是有限的,尤其是在32bit的OS下,此问题尤为突出(通常不会超过1.5G),虽然64bit的OS可以改善此问题,但是由于Java垃圾回收机制的限制,为避免过长时的垃圾回收暂停,通常建议为每个JVM分配不超过2G的堆内存空间。应用服务器本身就是JVM上层的应用需要占用一定的堆内存空间,而部署其上的应用又需要使用大量的堆内存空间(例如:典型的购物车应用)。这就造成了同在一个JVM的应用服务本身与部署其上的应用都要争抢有限的堆内存空间。所以在早期的最佳实践中,建议应用开发人员尽量少用HttpSession,只在HttpSession中存放Stub或对象ID。这样做的副作用就是加剧了应用对于CPU与数据库的压力。
2. 不必要硬件资源浪费
当我们的集群处理能力(通常包括:内存、CPU、IO)不能满足业务需求时,我们可以通过增加服务器的方式水平扩展。但是很多情况下,最先到达处理上限的是内存,内存的吃紧反过来也会造成其它两个资源的消耗加剧(例如:造成大量的Page Out)。也就是说,我们对系统进行水平扩展的很大动因是为了获得更多的内存,其代价就是牺牲了大量的服务器硬件资源。
所以理想的模式是将分布内存与应用服务器分离,各司其职。如下图:

截自其它案子,将就用吧:)
图中的架构中,上面就是应用服务器集群,物理服务器上的内存及计算资源完全由应用服务器使用。下面则是一个可线型扩展的分布式共享内存区,我们称作数据网格。当我计算能力不足时就在上面的应用服务器集群添加服务器,如果分布内存不足时,就在下面的数据网格添加服务器或服务进程提供内存。
3. 代码侵入性
虽然市面上有很多类似的数据网格的方案,但是很多方案都不可避免有代码入侵性,最好的也是只是通过JSR107进行规范。从大多数用户的视角,好的架构应该是尽可能尊重规范要求,同时最大限度的减小应用与应用容器的耦合。也就是说,我们不应该因为数据网格的引入造成大量的原有代码修改或重写。
为什么应用需要共享内存?
1. 打通异质环境
在复杂的企业计算环境中,如何让数据流动是个很大的难题,尤其是在内存中流动。例如:如何让.NET访问JVM的内存区?这方面不是普通的分布式缓存系统能够解决的。这里最常见的例子就是网游系统,网游引擎缓存了大量的用户行为或其它信息,而市场部门想对这些行为数据进行分析,这就需要打通这两套系统的内存边界。
2. O-R映射
这也是一个老生长谈的话题,在过去,如果我们想在一个基于内存的分布式缓存系统缓存一条来自于数据库的记录怎么实现?取出->实例化->缓存->访问。在这个过程中实际上是两部动作,一是OR-映射,二是是放入分布式缓存系统中管理。其实,我们需要的方式是这样的,当我需要访问某些对象实体就去访问分布式缓存,如果有,取之,没有,由分布式缓存系统去访问数据库将结果值实例化放入分布式缓存系统中。作为客户程序员无需关注底层细节。简单来讲就是将O-R解决方案(如:Toplink、Hibernate)与分布式缓存系统结合。
3. 容器注入支持
J2EE发展到现在,应用开发人员访问由应用服务器容器管理的资源时无非是通过资源注入或是查找JNDI树的方式。虽然现在有很多分布式缓存解决方案或开源项目,但是都缺乏商业应用容器的内置支持,很难通过让程序员通过标准的J2EE的方式访问分布缓存资源,这也正是ActiveCache要去解决的问题。
ActiveCache还提供了什么?
其实,上面所提到的功能点产品早已实现。但是唯一让用户不爽的是没有将Coherence与WLS原生集成,这样给用户带来了很大的管理维护成本。ActiveCache的出现着重解决的也正是这些问题,例如:我们可以通过WLS控制台管理控制Coherence节点。我们还可以借助WLST脚本生成相关配置与资源。
一句话ActiveCache是什么:WLS+Coherecne+维护、管理、监控支持。
参考
(完)