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



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

映射的状态不会在服务器之间共享。服务器 A 上的应用程序将对象放入映射中,一旦重新加载并负载平衡到服务器 B 上,该对象在映射中不可用。分布式地图的行为类似于哈希图,根本不会被分发。

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

@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"创建对象的新实例。相反,我们希望能够在两个服务器之间共享映射的状态。

如何实现这一点?

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

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

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

最新更新