【发布时间】:2021-09-21 11:57:06
【问题描述】:
是否有可能在部署到 Cloud Foundry 的应用程序的多个实例之间进行通信? 我检查了 Cloud Foundry API,但找不到任何关于这个主题的内容。 我已经尝试过 Hazelcast,但不幸的是,我的 Cloud Foundry 提供商不支持多播,所以我必须知道每个其他实例的 IP 地址才能连接。
我想我不可能是唯一对此感兴趣的人。
【问题讨论】:
是否有可能在部署到 Cloud Foundry 的应用程序的多个实例之间进行通信? 我检查了 Cloud Foundry API,但找不到任何关于这个主题的内容。 我已经尝试过 Hazelcast,但不幸的是,我的 Cloud Foundry 提供商不支持多播,所以我必须知道每个其他实例的 IP 地址才能连接。
我想我不可能是唯一对此感兴趣的人。
【问题讨论】:
我建议您使用消息传递服务(如 RabbitMQ)在应用程序实例之间进行通信。您还可以将共享信息存储在数据库服务或文件系统之外的任何远程位置。
在云中构建需要此类通信的应用程序通常不是一个好习惯。理想情况下,每个实例都应该能够独立运行并且是无状态的。
【讨论】:
Scheduler(Node.js 中的调度模块或 JavaEE 中的注释)。对于概念验证,调度程序每分钟将一个值写入数据库。但是对于 2..n 个实例,我不想每分钟有 2..n 个条目,所以我正在寻找一些东西来同步这些实例,以便所有实例中只有一个写入数据库 - 可能每个实例都有一个不同的实例分钟由于负载或可用性。
如果您可以通过编程方式访问 IP 地址,则可以构建 Hazelcast Config 对象并使用它来设置集群。然后,您可以依赖 tcp-ip 发现。
伪代码:
List<String> ipAddresses = cloudfoundry.getIps()
Config config = new Config();
config.getJoinConfig().getIpDiscovery().addMembers(ipAddresses)
HazelcastInstance hz = Hazelcast.newHazelcastInstance(config);
您甚至可以加载现有的 Hazelcast XML 配置并使用 XmlConfigBuilder 即时增强它。
【讨论】:
在某些情况下,实例可能需要在它们之间进行通信,而不是使用外部组件来提高效率或避免依赖。一种可能性是在 http 中使用带有特定实例 ID 的 gorouter 本身,并带有以下标头。 X-Cf-App-Instance=app-uuid:instanceno-integer
此链接中解释了我尚未探索的其他选项 https://ict.swisscom.ch/2018/05/container-networking-with-cloud-foundry/
【讨论】: