最近一段时间我在学习 Terracotta,一种 JVM 级的集群化技术。infoQ 上的<<introduction to="" open="" terracotta="">> 是一篇简要介绍 Terracotta 技术原理和应用的文章,适合大家为了解 Terracotta 而去阅读。为了能更好的理解这篇文章,也希望能够对大家了解 Terracotta 有所帮助,下面我将这篇文章从</introduction> Object Identity and Serialization 开始的部分的每段大意写了出来。写的不好,大家凑合看吧(*^__^*) 嘻嘻……
对象识别与序列化<o:p></o:p>
Terracotta 不使用 Java 序列化去复制对象的改变。<o:p></o:p>
这种方式要比使用 Java 序列化去复制对象的改变更有效率,因为这种方式仅仅在集群中移动被改变了的数据而不是序列化整个对象图。除了更有效率,这种方式还有另外一个好处:可以保持对象的识别符(ID)。<o:p></o:p>
之所以许多其它的集群和缓存技术需要一个 GET/PUT API,是因为如果使用 Java 序列化在集群中移动改变了的数据,被改变的对象将要被反序列化,并且不得不替换存在了的对象实例。<o:p></o:p>
Terracotta 没有这种限制。<o:p></o:p>
(略)<o:p></o:p>
在我们的例子中,Catalog 中的Product 对象与 shopping cart 中的 Products 是堆中的相同对象。<o:p></o:p>
虚拟堆/网络附加存储<o:p></o:p>
Terracotta 可以让我们有效率地使用有很大的对象图的本地 JVM 堆。Terracotta 会根据实例的使用模式去裁剪共享的对象图的本地实例。Terracotta 在集群对象图上维持一个可配置的窗口,不适应一定比例的堆的片段将根据一个缓存策略被清除。当需要那些丢失的片段的时候,它们将会重新从服务器中被载入(fault into?)。你可以将 Terracotta 集群看作是任意大的虚拟堆或network-attached memory。<o:p></o:p>
这个特性将允许任意大的对象图“载入”标准大小的堆中。在我们的例子中,如果 Catalog 的数据量变得很大,在没有 Terracotta 的情况下,我们将投入大量的硬件资源去保持高可用性和高扩展性。<o:p></o:p>
(略)<o:p></o:p>
<o:p> </o:p>
你怎样和什么时候使用 Terracotta?<o:p></o:p>
下面列出的是四个有效使用 Terracotta 的用例:<o:p></o:p>
在一个多服务器环境中进行 HTTP Session 复制可能是最熟悉不过的用例了。现在应用程序的设计趋势是诸如购物车这样的应用程序状态信息存储在一个例如数据库的外部系统(注:放在关系型数据库中对应用程序的性能是有影响的,更好的做法是放在一个公共服务器的内存中),这被称作“无状态”应用程序设计。<o:p></o:p>
这种“无状态”的方法并不是真的无状态。这种方法带来了两种负面影响,第一是对性能的影响,第二是对程序结构的影响。<o:p></o:p>
Terracotta 的 Session 复制允许应用程序的 Session 数据保持原有的位置和形式,从而使网络应用程序的软件架构依旧简单。<o:p></o:p>
Terracotta Session 复制通过允许任何应用程序去访问任何活动的 Session 来提供高可用性,无论那个 Session 是在哪里被创建的。它的扩展性很好,因为只有那些在 Session 中被改变了的数据会被复制,并且仅发送到需要它们的地方。如果没有其它的应用程序服务器在堆中拥有这个 Session,那么将没有其它的服务器会被发送这些修改。只有当服务器失败事件发生时,Session 数据才会被复制到其它应用程序服务器,并且仅发生在要求的时候。<o:p></o:p>
有了 Terracotta,你只需像在单个 JVM 环境中去使用 Session 即可,Terracotta 会很好的完成其它事情。<o:p></o:p>
在集群运行的时候,你能够看到整个集群中所有的 Session 的内容。在开发的时候,这被用来发现对 Session 的不恰当使用。在产品使用阶段,你能够立即观察到有多少活动的 Session,并且看到它们实时的变化。<o:p></o:p>
Terracotta 可以和很多流行的 Web 框架工作,诸如 Struts、Spring Web Flow 和 Wicket。<o:p></o:p>
<o:p> </o:p>
POJO 和 Spring 集群<o:p></o:p>
Terracotta 在集群中与 POJO 工作就如同是在单个 JVM 环境中简单,尤其是当你的应用程序使用了 Spring beans。<o:p></o:p>
Terracotta for Spring 通过集群 Spring beans,从而在集群中非侵入式地维护 Spring Framework。你可以像平常那样开发 single-JVM 的 Spring 应用程序,然后定义你想集群哪些 Spring Context 和在这些 Context 下的哪些 Spring bean。Terracotta for Spring 也包含对 Spring Web Flow 的支持(continuations?)。这项特性使构建在 Terracotta 集群上的 Spring Web 应用程序能够失败转移会话状态。<o:p></o:p>
<o:p> </o:p>
分布式缓存<o:p></o:p>
(略)<o:p></o:p>
<o:p> </o:p>
协作、协调和事件<o:p></o:p>
Terracotta 的集群并发的特性使它成为 JVM 之间非常理想的信号量。<o:p></o:p>
Terracotta 可以在集群上实现 Master-Worker 模式,从而处理并发事件。<o:p></o:p>
<o:p> </o:p>
总结<o:p></o:p>
Terracotta 是一个新型轻量软件栈的基础(什么意思,Terracotta 规模还要做大?)。Terracotta使得开源组件诸如Tomcat、Spring、Geronimo 和开源应用程序框架的 host? 可以组装在一起,并且以企业级的可用性和可扩展性被部署的JVM 级的集群技术可以轻易的被使用。<o:p></o:p>