当有N个客户端节点但只有1个服务器节点时,Ignite的负载平衡器(例如RoundRobinGlobalLoadBalancer)不处理服务器节点反弹。存在该问题,因为没有其他服务器节点将为唯一的服务器节点发布/处理EVT_NODE_FAILED,EVT_NODE_JOINED,EVT_NODE_LEFT事件。因此,如果某个客户端节点正在使用远程代理,就像它在下面的代码片段中所示
public <T> T locate(String serviceName, Class<T> serviceClass) {
return ignite.services().serviceProxy(serviceName, serviceClass, false);
}
然后在服务器节点被退回后,您将尝试使用代理失败,即IgniteException“任务拓扑没有活动节点”。
现在为了解决上述拓扑(具有1个服务器节点)的问题,我必须在使用固定版本的RoundRobinGlobalLoadBalancer的IgniteConfiguration中指定自定义“loadBalancingSpi”。在固定平衡器的代码中,我还订阅了EVT_CLIENT_NODE_RECONNECTED,它被发送到客户端节点。这样,我确保使用正被退回的服务器节点的UUID更新节点的快照。
有人知道是否有更简单的方法来解决这个问题?
答案 0 :(得分:0)
服务代理根本不应该通过负载均衡器,因为它在关闭执行之前手动映射到特定节点。这已在主分支中修复,您的方案在那里工作。
对于负载均衡器中的节点快照,您是对的,存在问题。以下是此票:https://issues.apache.org/jira/browse/IGNITE-2975