Coherence是Oracle为了建立一种高可靠和高扩展集群计算的一个关键部件,集群指的是多于一个应用服务器参与到运算里。Coherence的主要用途是共享一个应用的对象(主要是java对象,比如Web应用的一个会话java对象)和数据(比如数据库数据,通过OR-MAPPING后成为Java对象)。
  简单来说,就是当一个应用把它的对象或数据托管给Coherence管理的时候,该对象或数据就能够在整个集群环境(多个应用服务器节点)共享,应用程序可以非常简单地调用get方法取得该对象,并且由于Coherence本身的冗余机制使得任何一个应用服务器节点的失败都不会影响到该对象的丢失。其实如果不使用coherence,对于一个会话在多个应用服务器节点的共享一般是通过应用服务器本身的集群技术,而Coherence的创造者则认为基于某种应用服务器技术的集群技术来共享会话变量的技术并不完整,而专门开发出Coherence这个产品(原来称为tangosol)并且最后被Oracle收购,这个产品既有原来各种应用服务器集群所具有的各种技术特点,而且又增加了原来各种应用服务器集群技术所没有的各种特性。
  要学习这个产品,需要记住并注意的一点是:Coherence所有的设计都是基于多个(可以是非常多)的JVM,很多Coherence的测试都是使用几十甚至上百个节点来进行的。
  Coherence的一些技术特点
  Coherence产品首先是被设计用于高扩展性:
  所谓高扩展性就是当一个应用服务器能够处理2000笔交易,则10个应用服务器应该能够处理20000笔交易。
  一般而言,整个应用架构的扩展性由架构里的最不能扩展的部位(称之为瓶颈)决定,这个瓶颈一般而言都是数据源的处理,Coherence针对这种理解提供了应用层的数据共享缓冲,任何一个时候如果应用能够从这个数据缓冲里满足要求,则不会将请求发给数据源,从而极大地增强一般的瓶颈(数据)的扩展性。
  为了加强数据的写处理性能,Coherence还设计了延迟写的功能,就是应用的写会先缓存在Coherence的缓冲区,然后延迟写到数据库里,为了减轻数据源的写压力,Coherence只把最近的更改写到数据源,比如一条数据被更改了多遍,则只有最后的更改会被提交到数据源。而且,如果可能,多个SQL语句会被变成一个SQL语句批,一次提交给数据源,这样又极大地降低了对数据源的压力。
  熟悉于数据库应用程序,参加过性能测试的有经验的朋友应该知道这非常多的场合,上述Coherence的特点刚好是对应了非常多的经常遇到的应用出现问题的场景。
  一个典型的使用Coherence的架构图是:
  即Coherence被放在应用服务器和数据库服务器之间,从而解决通常应用架构里的瓶颈(数据瓶颈)来提高整个应用架构的可扩展性。
  Coherence的第二个非常重要的特地是支持数据的分区处理,就是如果有N个处理节点,则每个节点只管理1/N的数据,当一个节点失效时,该节点的数据会在剩下的节点均分,每个节点将管理1/(N-1)的数据。同样的,当一个节点增加进来时,则每一个节点都会分配一部分数据给新的节点,则最终每个节点只管理1/(N+1)的数据。大家知道,一般应用服务器的集群都有只能缓冲共享2G java对象的缺点,而Coherence这种设计让Coherence能够处理非常多的数据,只需要通过增加节点的数量,就可以处理更多的数据。
  如果安装了Coherence,则应用服务器不需要配置专有的服务器集群技术,因为Coherence*web模块提供了可用于处理http会话信息在Coherence集群内共享的功能,当一个节点需要读取HTTP会话信息而发现自己没有该会话信息的时候,它会把请求同时发给所有的节点(multicast),而当一个节点需要写HTTP会话信息的同时,它也会把写请求发给所有的节点,所以2个节点的处理和100个节点的处理都是一样的。
  Coherence的使用场景
  Coherence可以用于下面图示的一些技术场景:
  1. Caching:正如Coherence的别名是Data Grid,Coherence在这种场景主要是被用于缓存数据源的数据,当应用需要数据时,直接从Coherence里面取得而不是从后台数据源取得。比如用于缓存用户的个人设置信息。这种使用方式可以极大降低对后台数据源的压力,并且甚至当后台数据源不可用的时候也不影响系统的可用性。
  2. Analytics:用于查询,从简单查询到复杂查询,比如用于查询金融交易系统的投资者持仓信息(非常密集的查询)。这种使用方式还可以使用多个节点的并发查询。
  3. Transactions:在Coherence直接处理交易,可以在Coherence直接提交交易,从而得到极快的响应速度和高可扩展性。
  4. Events:Coherence里可以使用事件驱动的架构,能够对事件做出实时的处理。比如在线游戏使用EDA架构处理“武器”,“装备”的买卖交易。