当服务器节点为具有 1 个服务器节点的拓扑反弹时,参与负载平衡的节点的 Ignite 快照不会更新
Ignite's snapshot of nodes participating in load balancing is not updated when server node gets bounced for topology with 1 server node
Ignite 的负载均衡器(例如 RoundRobinGlobalLoadBalancer)在有 N 个客户端节点但只有 1 个服务器节点时不处理服务器节点反弹。问题存在,因为没有其他服务器节点将 post/handle 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 "Task topology does not have alive nodes"。
现在要为提到的拓扑(具有 1 个服务器节点)解决此问题,我必须在使用固定版本的 RoundRobinGlobalLoadBalancer 的 IgniteConfiguration 中指定自定义 "loadBalancingSpi"。在固定平衡器的代码中,我还订阅了 EVT_CLIENT_NODE_RECONNECTED,它被发送到客户端节点。通过这种方式,我确保节点的快照使用正在退回的服务器节点的 UUID 进行更新。
有人知道是否有更简单的方法来解决这个问题吗?
服务代理根本不应该通过负载平衡器,因为它在关闭执行之前手动映射到特定节点。这已经在 master 分支中修复,并且您的方案在那里工作。
至于负载均衡器中的节点快照,你是对的,有问题。这是这张票:https://issues.apache.org/jira/browse/IGNITE-2975
Ignite 的负载均衡器(例如 RoundRobinGlobalLoadBalancer)在有 N 个客户端节点但只有 1 个服务器节点时不处理服务器节点反弹。问题存在,因为没有其他服务器节点将 post/handle 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 "Task topology does not have alive nodes"。
现在要为提到的拓扑(具有 1 个服务器节点)解决此问题,我必须在使用固定版本的 RoundRobinGlobalLoadBalancer 的 IgniteConfiguration 中指定自定义 "loadBalancingSpi"。在固定平衡器的代码中,我还订阅了 EVT_CLIENT_NODE_RECONNECTED,它被发送到客户端节点。通过这种方式,我确保节点的快照使用正在退回的服务器节点的 UUID 进行更新。
有人知道是否有更简单的方法来解决这个问题吗?
服务代理根本不应该通过负载平衡器,因为它在关闭执行之前手动映射到特定节点。这已经在 master 分支中修复,并且您的方案在那里工作。
至于负载均衡器中的节点快照,你是对的,有问题。这是这张票:https://issues.apache.org/jira/browse/IGNITE-2975