【问题标题】:Infinispan Clustering: Replication of entries loaded by a CacheLoaderInfinispan 集群:复制由 CacheLoader 加载的条目
【发布时间】:2014-10-02 01:17:52
【问题描述】:

对不起,文字墙;底部有一个摘要。

我正在设计一个将在多个服务器上运行的 Java 应用程序的原型。每个实例都有一个嵌入式 Infinispan 缓存,并且这些缓存被配置为在复制模式下形成一个集群。缓存条目仅从外部系统加载 - 无需使用 cache.put(key, value) 主动添加条目。

为此,我实现了一个自定义 CacheLoader。按需加载值正在工作,但这些条目不会复制到其他活动集群节点。出于测试原因,我尝试使用“put”添加条目 - 这些条目会立即复制。

用户指南向我指出了在节点加入/离开集群时或在写入期间影响集群行为的属性,例如 fetchPersistentStatesharedfetchInMemoryState 。后者在我的情况下很有用,因为加入集群的新节点应该接收当前状态。启动期间的初始同步甚至是获取缓存加载器加载的条目。

fetchPersistentState 导致错误,因为我的缓存加载器没有实现 AdvancedCacheLoader - 但由于在调用“加载”后似乎没有调用高级方法,我认为正确实现该接口不会解决我的问题。

我还阅读了有关 ClusterLoader 实现的信息

向集群中的其他成员咨询价值

但是到其他节点的往返会增加处理请求时的响应时间。

尝试只加载一次值的基本原理是,对共享外部系统的调用被认为是相当昂贵的,因此由复制消息创建的增加的集群开销应该仍然比在每个节点。

为了获得某种独立的测试和代码示例,我在 Github 上创建了 infinispan-quickstart/clustered-cache 示例,并根据我的需要对其进行了调整:

https://github.com/flpa/infinispan-quickstart/tree/master/clustered-cache

缓存现在由 CacheLoader 支持,节点定期获取/放置值以演示如何复制“放置”值,但从加载器获取的值不是。

总结一下:

是否可以在复制模式下配置 Infinispan 集群,完全由缓存加载器查找填充并在所有节点上复制这些查找的结果?

编辑:我不小心删除了 Github 分支,所以我从头开始重新创建它,只包括相关的“集群缓存”文件夹并修改了上面的链接。

【问题讨论】:

    标签: java infinispan


    【解决方案1】:

    恐怕开箱即用的配置选项不可用。但是,您可以在每个节点上为@CacheEntryLoaded 事件注册侦听器,并在此侦听器中执行putAsync()。请务必包含标志 SKIP_CACHE_LOADSKIP_CACHE_STOREIGNORE_RETURN_VALUES 以获得最佳性能。

    【讨论】:

    • 感谢 Flavius,我在我的测试应用程序中实现了这个解决方案并且它正在工作。我可能需要一些时间才能在现实环境中对此进行测试,但我会立即接受答案。
    猜你喜欢
    • 2016-06-08
    • 2013-04-02
    • 2020-10-25
    • 1970-01-01
    • 2019-03-28
    • 2018-09-27
    • 2013-06-17
    • 2017-11-09
    • 1970-01-01
    相关资源
    最近更新 更多