背景:
- 我有一个基于 spring 的网络应用程序。
- 在本地开发机器上,我有 2 个运行相同应用程序的 tomcat 实例 - 这样我就可以测试网络场节点如何相互通信
- 我使用 Jelastic 云进行应用部署
- 在 Jelastic 上它不是作为网络农场运行,而是使用滚动更新机制(当
AppV1
在NodeA
上运行并处理用户请求时,我开始AppV2@NodeB
,对其预热并将用户请求重定向到它。目标是让NodeB
从NodeA
复制所有 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
不存在,整个应用程序就会崩溃(部署失败)。
问题是 如何让它在场景中工作
TcpDiscoveryVmIpFinder
被使用NodeA
启动(而NodeB
未启动)- 期望:
NodeA
可以正确运行任何时间(当然我不能向 Remote 发送消息,因为没有连接 Remote - 没关系) - 随时
NodeB
启动 - 期望:
NodeA
和NodeB
找到彼此并相互通信(主要用于 session 复制和其他消息) NodeA
已停止- 预期:
NodeB
继续正常运行以服务用户请求 - 现在切换:
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/