首页 > 解决方案 > Infinispan 集群 REPL_ASYNC 缓存:命令在两个节点之间无限期反弹

问题描述

我在 2 节点集群中使用 infinispan 10.1.8 运行 Spring Boot 应用程序。2 个节点通过 jgroups TCP 进行通信。我配置了几个 REPL_ASYNC。

问题:这些缓存之一在某些时候导致两个节点一遍又一遍地交换相同的消息,从而导致 CPU 和内存使用率很高。阻止这种情况的唯一方法是停止两个节点之一。

更多细节,这里是配置。

 org.infinispan.configuration.cache.Configuration replAsyncNoExpirationConfiguration = new ConfigurationBuilder()
                .clustering()
                    .cacheMode(CacheMode.REPL_ASYNC)
                .transaction()
                    .lockingMode(LockingMode.OPTIMISTIC)
                .transactionMode(TransactionMode.NON_TRANSACTIONAL)
                .statistics().enabled(cacheInfo.isStatsEnabled())
                .locking()
                    .concurrencyLevel(32)
                    .lockAcquisitionTimeout(15, TimeUnit.SECONDS)
                    .isolationLevel(IsolationLevel.READ_COMMITTED)
                .expiration()
                    .lifespan(-1) //entries do not expire
                    .maxIdle(-1) // even when they are idle for some time
                    .wakeUpInterval(-1) // disable the periodic eviction process
                .build();

这些缓存之一(名为formConfig)导致我在两个节点之间进行异常通信,这就是发生的情况:

  1. 使用 jmeter 我生成仅针对节点 1 的流量负载
  2. 一段时间以来,节点 2 通过 SingleRpcCommand 从节点 1 接收缓存条目,没有异常,甚至formConfig缓存行为正常
  3. 一段时间后,一个新的缓存条目被发送到formConfig缓存

此时,相同的消息似乎在两个节点之间不断反弹:

其他一些事情:

这是一个更完整的日志文件,包括来自两个节点的日志。

其他信息:

我怀疑

标签: spring-bootcachingcluster-computinginfinispan

解决方案


唯一可能发生这种情况的情况是SimpleKey具有不同的hashCode().

日志中有异常吗?您是否能够检查hashCode()密钥的序列化和反序列化后是否相同?


推荐阅读