如何在WebSphere 9集群环境中使用分布式对象高速缓存

时间:2019-07-12 13:45:21

标签: spring-boot websphere distributed

我们有一个包含2台服务器的WAS9集群。我们的应用程序依赖于维护对象列表。在服务器A上运行的应用程序创建一个对象,并且该对象不在服务器B上的应用程序实例的范围内。为了复制对象状态,我们尝试在“资源”->“缓存实例”->“对象缓存实例”(范围)下启用“分布式缓存”是群集,提供程序是默认动态缓存,启用了缓存复制)

服务器之间未共享映射状态。服务器A上的应用程序将一个对象放入映射中,一旦重新加载并负载均衡到服务器B上,该对象在映射中将不可用。 DistributedMap的行为类似于HashMap,并且根本无法分发。

这是一个简单的代码示例,显示了我们如何尝试使用分布式缓存功能:

@RequestMapping("/test_object_map")
    @Async
    public String testObjectMap(@RequestParam(value="input", defaultValue="") String input) throws InterruptedException, NamingException, UnknownHostException {

        InitialContext ic = new InitialContext();
        DistributedObjectCache wasCashe = (DistributedObjectCache)ic.lookup(DIST_MAP_NAME);

        String testKey = "test_key";
        UseCase object = null;

        if(wasCashe.containsKey(testKey)) {
            object = (UseCase) wasCashe.get(testKey);

        } else {
            object = new UseCase();
            object.setSignature(" UC launched on " + InetAddress.getLocalHost().getHostName());
            wasCashe.put(testKey, object);

        }

        String status = "";

        if(object != null) {
            status = "host: " + InetAddress.getLocalHost().getHostName() + "; object state: " + object.getSignature() ;
        }

        return "[{\"message\": \"" + status + "\"}]";
    }

我们观察到的行为是,对象在“ server_1”上实例化,并且当请求平衡到“ server_2”上时,该对象不存在,并且该对象的新实例由“ server_2”创建。相反,我们希望能够在两个服务器之间共享地图的状态。

如何实现?

1 个答案:

答案 0 :(得分:1)

为了在WebSphere集群成员之间复制内容,必须设置DynaCache缓存实例以进行复制,并与复制域相关联,并且实际上是在JVM中创建的。定义缓存实例并不等于在JVM中创建缓存实例。调用ic.lookup()时将创建缓存实例。

我的猜测是,当server_1将内容放入缓存实例时,server_2尚未创建缓存实例,因此不会复制内容。我假设您已将共享策略设置为PUSH。

要在服务器启动时强制创建高速缓存实例,请添加定制属性com.ibm.ws.cache.CacheConfig.createCacheAtServerStartup并将其设置为true。您可以将其添加为JVM定制属性(影响所有缓存实例)或缓存实例上的定制属性(仅影响此缓存实例)。