为何WildFly 18中本地Infinispan缓存等待远程响应?
让我来帮你拆解这个看起来有点矛盾的问题——明明定义为本地缓存的studiomanager,却抛出了等待远程节点node4响应的超时错误,这确实违背了我们对本地缓存的认知,下面从几个核心角度分析可能的原因和排查方向:
核心矛盾梳理
首先明确你的场景和异常关键点:
- 环境:WildFly 18 + Infinispan 9.4.16.Final,多节点Docker部署,配置一致
- 缓存配置:
studiomanager是<local-cache>,归属的InfinispanSystem容器配置了<transport/>(集群传输层) - 异常:
RemoveExpiredCommand执行时触发ISPN000476: Timed out waiting for responses for request 7916397 from node4
可能的原因分析
1. 集群缓存容器的隐含行为
虽然studiomanager是本地缓存,但它归属的InfinispanSystem容器配置了<transport/>,这意味着整个容器是集群模式的。在Infinispan 9.x版本中,集群容器内的本地缓存可能会受到集群上下文的影响——比如某些过期/驱逐逻辑的代码路径,错误地复用了集群容器的远程通信机制,即使本地缓存不需要跨节点同步。
2. 运行时配置被意外修改
你提到未通过CLI修改配置,但Docker部署场景下可能存在以下隐式修改:
- 容器启动时挂载的
standalone.xml被覆盖(比如卷挂载错误) - 应用代码中通过Infinispan API动态修改了
studiomanager的缓存配置(比如将其改为复制/分布式缓存) - 集群节点间的配置同步出现异常,导致部分节点的
studiomanager实际是集群缓存
3. Infinispan版本的已知bug
Infinispan 9.4.16.Final属于较旧的版本,可能存在本地缓存误触发远程通信的bug。比如在过期任务的处理逻辑中,错误地将本地缓存的操作发送到集群节点。
4. 集群视图异常
如果node4已经从集群中失联,但本地缓存的过期任务仍持有旧的集群视图,可能会尝试向已下线的节点发送请求,从而触发超时。
排查步骤建议
验证运行时配置:通过WildFly CLI在每个节点执行以下命令,确认
studiomanager确实是本地缓存:/subsystem=infinispan/cache-container=InfinispanSystem/local-cache=studiomanager:read-resource确保返回的配置中没有
replicated或distributed相关的属性。检查集群状态:执行以下命令查看集群视图,确认
node4的状态是否正常:/subsystem=infinispan/cache-container=InfinispanSystem:view如果
node4已下线,尝试重启集群或清理无效节点的集群状态。核对应用代码:检查获取
studiomanager缓存的代码逻辑,确保是从InfinispanSystem容器获取本地缓存实例,没有误引用其他集群缓存。比如:// 确保是获取本地缓存,而非集群缓存 Cache<String, Object> cache = cacheManager.getCache("studiomanager");版本升级测试:尝试将Infinispan升级到9.4.x系列的最新稳定版本(比如9.4.30.Final),看是否能解决该bug。
隔离本地缓存容器:如果上述排查无效,可以尝试将
studiomanager迁移到一个没有配置<transport/>的独立本地缓存容器,彻底隔离集群上下文,验证是否还会触发远程超时。
内容的提问来源于stack exchange,提问作者Joc

