背景:
- 我有一个基于弹簧的网络应用程序。
- 在本地开发机器上我有 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 步开始重复