我在分布式异步模式下使用 Infinispan,在 4 个不同的系统上有 4 个节点。每个节点以 3 GB 的堆大小运行。
只有一个节点扮演加载器的角色,并尝试以块的形式加载 5000 万条记录(在循环中,500 万条记录进入缓存 10 次)。根据我的计算,4 个节点可以处理那么多数据,因此空间不是问题。
当我启动所有 4 个节点时,群集会成功形成,数据开始加载到缓存中。但是由于数据非常庞大,一段时间后任何一个节点都无法从另一个节点获得响应,并且失败,并出现以下异常:
2013-11-01 05:35:14 ERROR org.infinispan.interceptors.InvocationContextInterceptor - ISPN000136: Execution error
org.infinispan.util.concurrent.TimeoutException: Timed out after 15 seconds waiting for a response from INUMUU410-54463
at org.infinispan.remoting.transport.jgroups.CommandAwareRpcDispatcher.processCalls(CommandAwareRpcDispatcher.java:459)
at org.infinispan.remoting.transport.jgroups.CommandAwareRpcDispatcher.invokeRemoteCommands(CommandAwareRpcDispatcher.java:154)
at org.infinispan.remoting.transport.jgroups.JGroupsTransport.invokeRemotely(JGroupsTransport.java:534)
INUMUU410-54463 是计算机名称。
(复制自上面的Flavius评论:)
在您的情况下,我要做的是将其拆分为一个 putAll 不包含超过 1MB 的数据,然后同步发送这些数据(使用 cache.getAdvancedCache().withFlags(FORCE_SYNCHRONOUS))。或者以其他方式限制正在直播的消息数(另请参阅高级缓存上的 putAllAsync 方法)。