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

标签 java jelastic ignite

背景:

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

意图

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

问题

  • 但是在 Jelastic 上我没有多播,所以我必须明确定义 IP 地址列表(使用 TcpDiscoveryVmIpFinder),这没关系 - 我有每个节点的静态主机名。 但是 现在当 NodeA 启动时它会阻塞,直到它连接到 NodeB。如果 NodeB 不存在,整个应用程序就会崩溃(部署失败)。

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

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

最佳答案

您很可能错过了一件与 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

关于java - 如何使 Ignite 像使用 TcpDiscoveryMulticastIpFinder 一样使用 TcpDiscoveryVmIpFinder 进行非阻塞操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35378367/

相关文章:

java - Java 的 SQL 解析器库

grails - 将Grails部署到云(Jelastic) Bootstrap 问题?

ssl - Jelastic Nginx http 到 https 重定向

spring - 如何在 Jelastic 上配置 Tomcat 9 Spring REST 应用 WAR?

java - Apache Ignite 中的 session 写入超时问题

java - lighttpd : redirecting to another page causes duplicated hostname in path

java - Spring jdbctemplate 在应用程序关闭时关闭连接?

java - 如何在单节点上启动ignite

spring - 使用 Spring 事务管理点燃事务缓存

java - Android - 将 Telegram 消息发送到特定号码