Hazelcast RetryableIOException(Packet未发送)警告的触发场景与原因咨询
分析Hazelcast中"While asking 'is-executing'"警告的触发时机与原因
咱们先把你提供的日志内容贴出来,方便对照分析:
2017-06-24 23:46:41.211 WARN (vert.x-eventloop-thread-14) [c.h.s.i.o.i.Invocation] - [192.111.111.11]:5701 [Secure Email Gateway] [3.6.3] While asking 'is-executing': Invocation{serviceName='hz:impl:mapService', op=com.hazelcast.map.impl.operation.GetOperation{identityHash=1278259701, serviceName='hz:impl:mapService', partitionId=198, replicaIndex=0, callId=15947777, invocationTime=1498362385195 (Sat Jun 24 23:46:25 EDT 2017), waitTimeout=-1, callTimeout=8000, name=redirect.mapping.cache.info.for.451, name=redirect.mapping.cache.info.for.451}, partitionId=198, replicaIndex=0, tryCount=250, tryPauseMillis=500, invokeCount=1, callTimeout=8000, target=Address[192.111.111.11]:5701, backupsExpected=0, backupsCompleted=0, connection=null} java.util.concurrent.ExecutionException: com.hazelcast.spi.exception.RetryableIOException: Packet not send to -> Address[192.111.111.11]:5701 at com.hazelcast.spi.impl.operationservice.impl.InvocationFuture.resolveApplicationResponseOrThrowException(InvocationFuture.java:360) at com.hazelcast.spi.impl.operationservice.impl.InvocationFuture.get(InvocationFuture.java:225) at com.hazelcast.spi.impl.operationservice.impl.IsStillRunningService.isOperationExecuting(IsStillRunningService.java:85) at com.hazelcast.spi.impl.operationservice.impl.InvocationFuture.waitForResponse(InvocationFuture.java:275) at com.hazelcast.spi.impl.operationservice.impl.InvocationFuture.get(InvocationFuture.java:224) at com.hazelcast.spi.impl.operationservice.impl.InvocationFuture.get(InvocationFuture.java:204) at com.hazelcast.map.impl.proxy.MapProxySupport.invokeOperation(MapProxySupport.java:320) at com.hazelcast.map.impl.proxy.MapProxySupport.getInternal(MapProxySupport.java:250) at com.hazelcast.map.impl.proxy.MapProxyImpl.get(MapProxyImpl.java:94) at com.whatever.cache.provider.impl.HazelcastCacheProvider.getFromCache(HazelcastCacheProvider.java:112)
触发时机
这个警告的触发场景非常明确:
- 你的应用通过
HazelcastCacheProvider.getFromCache()调用了Hazelcast Map的get()方法,底层触发了GetOperation操作,要从redirect.mapping.cache.info.for.451这个缓存中获取数据 - 当这个操作尝试向目标节点(
192.111.111.11:5701)发送数据包失败后,Hazelcast的重试机制会启动,此时它会检查这个操作是否还在远程节点上执行(也就是日志里的While asking 'is-executing'),这个检查过程中抛出了警告 - 从日志的
invokeCount=1、tryCount=250能看出来:这是第一次发起调用,但因为发送失败,已经进入了重试流程(最多重试250次,每次间隔500ms)
核心原因
警告的根源是数据包无法发送到目标Hazelcast节点,对应日志里的RetryableIOException: Packet not send to -> Address[192.111.111.11]:5701,具体可能的诱因包括:
- 目标节点出现了短暂网络波动/连接中断:当前节点和目标节点之间的网络链路临时不可用,导致数据包发送失败
- 目标节点负载过高:CPU、内存或IO占用率太高,无法及时处理新的连接请求或数据包,导致发送超时
- 网络配置问题:比如防火墙限制了5701端口的通信,或者节点间的心跳配置不合理,导致连接被判定为失效
- 日志里的
connection=null也直接印证了:当前节点和目标节点之间没有可用的活跃连接,这是数据包发不出去的直接表现
另外要说明的是:这个警告是Hazelcast重试机制的正常日志输出,它会自动重试操作,如果重试成功,应用不会感知到异常;只有当所有重试都失败后,才会抛出最终的业务异常。
内容的提问来源于stack exchange,提问作者manish
相关产品推荐
相关产品推荐

