0

当有 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 进行更新。

有人知道是否有更简单的方法来解决这个问题?

4

1 回答 1

0

服务代理根本不应该通过负载均衡器,因为它在关闭执行之前手动映射到特定节点。这已经在 master 分支中修复,并且您的方案在那里工作。

至于负载均衡器中的节点快照,您是对的,存在问题。这是票:https ://issues.apache.org/jira/browse/IGNITE-2975

于 2016-04-11T23:14:05.840 回答