当有 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 进行更新。
有人知道是否有更简单的方法来解决这个问题?