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