如何使 Ignite 像使用 TcpDiscoveryMulticastIpFinder 一样使用 TcpDiscoveryVmIpFinder 进行非阻塞操作?

How to make Ignite act non-blocking with TcpDiscoveryVmIpFinder like it does with TcpDiscoveryMulticastIpFinder?

背景:

意向

问题

问题是 如何让它在场景中工作

  1. TcpDiscoveryVmIpFinder已使用
  2. NodeA 启动(而 NodeB 未启动)
  3. 期望:NodeA 可以正确运行任何时间(当然我不能向遥控器发送消息,因为没有连接遥控器 - 没关系)
  4. 随时NodeB开始
  5. 预期:NodeANodeB 找到彼此并相互通信(主要用于会话复制和其他消息)
  6. NodeA 已停止
  7. 预期:NodeB 继续正常服务于用户请求
  8. 现在切换:NodeA 变为 NodeB,反之亦然;从第 3 步开始重复

我找到了解决方法(不是解决方案)。如果您知道正确的解决方案 - 请在下面添加答案让我知道。

我将 TcpDiscoverySpi 子类化并覆盖 resolvedAddresses() 以测试候选人是否可以联系到他们。

该解决方案并不完美,因为现在如果 NodeA 没有找到 NodeB,它将永远不会重试寻找 NodeB。然而,这并不是一个阻碍,因为一旦 NodeB 开始,它就会到达 NodeA 并且他们开始互相交谈。如此有效的滚动更新机制对我有用。

方法 isCandidateRespond 是快速的解决方案,很可能会因情况而异。

这是一个代码片段:

public class TcpDiscoverySpiPrecheckingImpl extends TcpDiscoverySpi {
    private Logger log = Logger.getLogger(getClass());

    @Override
    protected Collection<InetSocketAddress> resolvedAddresses() throws IgniteSpiException {
        Collection<InetSocketAddress> candidates = super.resolvedAddresses();
        Collection<InetSocketAddress> approved = new ArrayList<>();
        for (InetSocketAddress candidate : candidates) {
            if (isCandidateRespond(candidate)) {
                approved.add(candidate);
            }
        }
        return approved;
    }

    private boolean isCandidateRespond(InetSocketAddress candidate) {
        if (log.isTraceEnabled()) {
            log.trace("Checking if remote node responds: " + candidate);
        }
        URL url = null;
        try {
            url = new URL("http://" + candidate.getHostName() + "/");
            try (InputStream stream = url.openStream()) {
                return true;
            }
        } catch (Throwable t) {
            log.info("Candidate remote node didn't respond: " + url + ". Reason: " + t.getMessage());
            return false;
        }
    }
}

很可能您错过了一件与 TcpDiscoveryVmIpFinder 相关的重要事情。节点 A 和 B 都必须在 IP 查找器的地址列表中包含自己的 IP 地址。这在本自述文件部分 [1] 中突出显示。 否则,您将遇到节点 A 必须等待节点 B 加入集群时遇到的情况。

为两个节点设置此 IP 查找器,一切都应按要求工作。

                <bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder">
                    <property name="addresses">
                        <list>
                            <value>hodeA_ip_address_or_host_name:47500..47509</value>
                            <value>hodeB_ip_address_or_host_name:47500..47509</value>
                        </list>
                    </property>
                </bean>

[1] https://apacheignite.readme.io/docs/cluster-config#static-ip-based-discovery