对不起,文字墙;在底部有一个摘要。
我正在为将在多个服务器上运行的Java应用程序进行原型设计。每个实例都有一个嵌入式Infinispan缓存,并且缓存配置为在复制模式下形成集群。缓存条目仅从外部系统加载 - 无需使用cache.put(key, value)
主动添加条目。
为此,我实现了一个自定义CacheLoader。按需加载值正在运行,但这些条目不会复制到其他活动集群节点。出于测试原因,我尝试添加条目' put' - 这些都会立即复制。
用户指南向我指出了在节点加入/离开群集时或在写入期间影响群集行为的属性,例如 fetchPersistentState , shared 和 fetchInMemoryState 。后者在我的情况下很有用,因为加入集群的新节点应该接收当前状态。启动期间的初始同步甚至可以获取缓存加载器加载的条目。
fetchPersistentState 导致错误,因为我的缓存加载器没有实现AdvancedCacheLoader - 但是因为在调用' load'之后似乎没有调用高级方法。我认为正确实现该接口不会解决我的问题。
我还阅读了关于
的ClusterLoader实现咨询群集中的其他成员以获取值
但是到其他节点的往返会增加处理请求时的响应时间。
尝试一次加载值的理由是,对共享外部系统的调用被认为是相当昂贵的,因此复制消息所产生的增加的集群开销应该比在每个上加载值的问题少。节点
为了获得某种孤立的测试和代码示例,我在Github上分发了 infinispan-quickstart / clustered-cache 示例并根据我的需要进行了调整:
https://github.com/flpa/infinispan-quickstart/tree/master/clustered-cache
缓存现在由CacheLoader支持,节点定期提取/放置值以演示如何放置'值被复制,但从加载器获取的值不是。
总结一下:
是否可以在复制模式下配置Infinispan集群,该模式完全由缓存加载器查找填充,并在所有节点上复制这些查找的结果?
编辑:我不小心删除了Github fork,所以我从头开始重新创建它,只包括相关的'集群缓存'文件夹并调整了上面的链接。
答案 0 :(得分:3)
我担心开箱即用的配置选项不可用。但是,您可以在每个节点上为@CacheEntryLoaded
事件注册侦听器,并在此侦听器中执行putAsync()
。请务必添加标记SKIP_CACHE_LOAD
,SKIP_CACHE_STORE
和IGNORE_RETURN_VALUES
以获得最佳效果。