背景:
- 我有一个基于弹簧的网络应用程序。
- 在本地开发机器上我有 2 个运行相同应用程序的 tomcat 实例 - 这样我测试网络场节点如何相互通信
- 我使用 Jelastic 云进行应用部署
- 在 Jelastic 它不是作为网络农场运行,而是使用滚动更新机制(在
AppV1
运行NodeA
并处理用户请求时,我启动AppV2@NodeB
,预热并将用户请求重定向到它。目标是让NodeB
复制所有会话NodeA
)
意图
- 当前发布版本使用基于 NodeJS 的第三个服务器作为节点间 MessageBus 的快捷方式。但最近我发现了 Ignite,并认为减少平台(nodejs)的数量并在 Java 中获取所有内容会很棒。
- 所以我用 Ignite 消息代替了基于 NodeJS 的消息。Ignite 使用 Spring XML 配置和初始化
org.apache.ignite.IgniteSpringBean
- 在本地运行我的应用程序时,
TcpDiscoveryMulticastIpFinder
它可以完美运行。NodeA
即使没有开始也NodeB
开始。当我启动NodeB
它时,它顺利加入集群,节点相互连接并完美通信。这里最重要的是我可以随时启动和停止节点,并且使用 Ignite 消息传递进行非阻塞无错误操作。
问题
- 但是在 Jelastic 上我没有多播,所以我必须明确定义 IP 地址列表(使用
TcpDiscoveryVmIpFinder
),这没关系 - 我有每个节点的静态主机名。但是现在NodeA
开始时它会阻塞,直到它连接到NodeB
. 如果NodeB
不存在整个应用程序崩溃(部署失败)。
问题是 如何使它在场景中工作
TcpDiscoveryVmIpFinder
用来NodeA
开始(虽然NodeB
没有开始)- 期望:
NodeA
正确运行任何时间(当然我不能向遥控器发送消息,因为没有连接遥控器 - 没关系) - 随时
NodeB
开始 - 期望:
NodeA
并NodeB
相互发现并相互通信(主要用于会话复制和其他消息) NodeA
停止- 期望:
NodeB
继续正常运行服务用户请求 - 现在 switch:
NodeA
变为NodeB
,反之亦然;从第 3 步开始重复