WAS使用DistributedMap实现分布式缓存节点数据共享

 

              在集群环境中,我们经常会需要实现数据在各节点间进行动态同步,或者是缓存同步更新对于这类需求,WAS本身提供了容器级别的缓存服务,并提供相关接口给应用程序调用,缓存本身的属性则可以直接在WAS控制台进行配置

 

              先看一下WAS提供的API接口,我们主要用到的是com.ibm.websphere.cache. DistributedMapDistributedMap扩展自java.util.Map,并增加了一些消息和监听的方法,可以在缓存对象发生改变时通知应用程序。缓存服务则是通过JNDI提供,只需要通过JNDI查找到预定义好的缓存服务,并转换为DistributedMap对象,即可投入使用,示例代码如下:

InitialContext ic = new InitialContext();

DistributedMap dm1 = (DistributedMap)ic.lookup("services/cache/instance_one");

实际应用中,如果没有使用到相关的消息机制,还可以将实例转换为java.util.Map对象,避免对WAS的直接依赖,如果应用需要部署到其他的应用服务器,也更容易切换到相应的实现。

 

              可以看出,编程方面是非常简单的,相对而言,配置上就比较复杂一些,这里以WAS 6.0版本为例,做一个简要介绍,更高的版本配置方法类似:

  1. 如果放到Map中的对象是自定义类型,而且需要在集群范围内共享,那这个对象必须实现Serializable接口
  2. 将自定义的对象类型打包成jar文件,注意这个文件中最好不要包含无关的class,否则可能导致类加载异常。将这个jar包上传到集群中每一个节点的服务器相同路径下,在WAS中创建一个指向此路径的共享库。方法是:
  • 登录WAS控制台,进入环境 > 共享库,选择应用服务器节点,并点击应用

  • 点击新建,填写共享库的相关信息

  • 在集群中的每个节点上重复此步骤。
  1. 为集群中的每个服务器创建一个classloader,并绑定到这个共享库,方法是:
    • 进入到服务器 > 应用程序服务器,在服务器列表中,点击集群中的服务器名称,进入服务器配置界面。

    • 在服务器配置界面中点击“Java和进程管理 > 类装入器在类装入器管理界面中,点击新建使用默认参数创建一个新的类装入器

    • 点击应用后,可以看到此类装入器的更多配置链接,点击

    • 库管理界面中点击添加,选择刚才创建的共享库,保存所有的配置。

  1. 经过以上的配置,缓存对象就具备序列化和同步的必要条件了。下面还需要创建一个复制域来设置缓存的共享范围。复制域的创建有两种方式:
    • 一是在创建集群时,选择为此集群创建复制域,可以自动创建一个与集群名称同名的复制域。

    • 如果在创建集群时没有创建复制域,可以进入环境 复制域界面新建一个,并将副本数选择为整个域

  1. 配置复制域后,还需要为服务器启用高速缓存复制,方法是:
    • 在服务器列表界面选择服务器名称,进入服务器详细配置界面,选择容器服务 > 动态高速缓存服务

    • 高速缓存服务配置界面,可以看到,服务器默认已经启用了高速缓存,我们需要启用高速缓存复制,并选择刚才创建的复制域。复制类型方面,具有推送和拉出仅推送仅拉出不共享四个选项。推送表示缓存发生变化时,主动推送到复制域的其他服务器;拉出表示在应用需要用到某个缓存实例时(如根据缓存key查找实例时),才从其他节点查找;推送和拉出则是两者相结合的方式,由服务器控制根据需要进行推拉操作;不共享则表示缓存仅对本服务器生效。需要注意的是,如果需要遍历缓存,则一定要使用仅推送的方式,否则可能无法正确获取到整个复制域范围内的缓存实例。推送频率如果设置为0则表示发生变化时立即推送到复制域中,这个参数需要根据服务器性能和压力来进行设置,一般可以使用默认设置。

  1. 经过以上配置,缓存的基础条件已经具备,我们可以根据需要创建缓存实例了。配置缓存实例有两种方式
  • 一是通过管理控制台配置,这种方式比较直观,管理起来也比较方便,是推荐的方式。进入高速缓存实例 > 对象高速缓存先在作用域中选择集群,并点击应用

  • 选择新建JNDI名称即程序中进行JNDI查找的名称,同时也要启用高速缓存复制,与应用服务器上的设置一致,但优先级要高于应用服务器层面的设置。

  • 除了在控制台界面进行配置,还可以使用配置文件进行配置,方法是创建一个名为cacheinstances.properties的文件,在这个文件中配置缓存属性,并将此文件放到应用的classpath中即可。这种方法虽然可以减少一点实施时的配置工作,但不够直观和灵活,不建议使用。一个配置实例如下,相关参数的具体含义可以参考信息中心文档。需要说明的是,replicationType值按照文档配置为2时,不能成功实现集群间的复制,改为PUSH后可以成功。

cache.instance.0=/services/cache/instance_one

cache.instance.0.cacheSize=5000

cache.instance.0.enableDiskOffload=false

cache.instance.0.flushToDiskOnStop=false

cache.instance.0.useListenerContext=true

cache.instance.0.enableCacheReplication=true

cache.instance.0.replicationType=PUSH

cache.instance.0.replicationDomain=AppCluster

cache.instance.0.disableDependencyId=false

cache.instance.0.htodCleanupFrequency=60

  1. 经过以上配置,就可以在应用中调用容器提供的缓存服务了当然,使用之前,不要忘了重启一下所有的服务器
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐