背景:

  • 我有一个基于Spring的Web应用程序。
  • 我在开发机器上本地的
  • 我有2个运行相同应用程序的tomcat实例-这样,我可以测试Web场节点如何相互通信
  • 我使用Jelastic云进行应用程序部署
  • jetlastic上的
  • 不是作为Web服务器场运行,而是使用滚动更新机制(当AppV1NodeA上运行并处理用户请求时,我启动AppV2@NodeB,对其进行预热并将用户请求重定向到它。目标是让NodeB复制所有内容来自NodeA的会话)

  • 意向
  • 当前发行版使用基于NodeJS的第三台服务器作为节点之间MessageBus的快捷方式。但是最近我发现了Ignite,并认为减少平台(nodejs)的数量并获得Java的所有功能将非常有用。
  • 因此,我用Ignite消息传递替换了基于NodeJS的消息传递。使用Spring XML配置和org.apache.ignite.IgniteSpringBean
  • 初始化Ignite
  • 当使用TcpDiscoveryMulticastIpFinder在本地运行我的应用程序时,它可以完美运行。即使没有启动NodeA,也会启动NodeB。当我启动NodeB时,它顺利地加入了集群,并且节点彼此连接并且可以完美通信。这里最重要的是,我可以随时启动和停止节点,并且可以使用Ignite消息传递进行无阻塞的无错误操作。

  • 问题
  • 但是在Jelastic上我没有多播,因此我必须显式定义IP地址列表(使用TcpDiscoveryVmIpFinder),这没关系-每个节点都有一种静态主机名。 但是现在会在NodeA启动时阻塞,直到连接到NodeB为止。而且如果NodeB不存在,整个应用程序将崩溃(难以部署)。

  • 问题是
    如何使其在方案中工作
  • 已使用TcpDiscoveryVmIpFinder
  • NodeA启动(而NodeB未启动)
  • 期望值:NodeA可以正确操作任何时间(当然,我无法将消息发送到遥控器,因为没有连接遥控器-没关系)
  • 随时NodeB启动
  • 期望值:NodeANodeB相互查找并彼此通信(主要用于会话复制和其他消息)
  • NodeA已停止
  • 期望:NodeB继续正常运行,可满足用户请求
  • 现在切换:NodeA变成NodeB,反之亦然;从步骤3重复
  • 最佳答案

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

    为两个节点都设置此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

    10-07 22:44