0

机器 A 需要向机器 B 发送消息。机器 A 具有静态 IP,但机器 B 没有。

我可以想到的解决此问题的一个选项是机器 B 打开与机器 A 的 TCP 连接,然后机器 A 将数据/消息发送到机器 B。但是,此解决方案具有以下限制:

a) 如果有很多机器(如机器 B)向其发送数据,则它是不可扩展的。这可能会破坏机器 A 的资源。

b) 机器 A 需要在需要时发送数据。机器 B 不知道什么时候会有数据。在当前的设计中,机器 B 将不得不通过 TCP 连接反复轮询机器 A,询问它是否有任何数据。如果有很多机器 B,这可能会变得昂贵。

有没有更便宜的方法来解决这个问题?观察者设计模式浮现在脑海中。机器 B 可以订阅来自机器 A 的通知,以便在数据可用时通知它。但是,当机器 B 没有静态 IP 时,如何在分布式环境中实现该模式?

除了观察者之外,除了使用机器 A 的原始套接字将数据发送到机器 B 之外,还有其他方法会更便宜吗?

4

4 回答 4

1

如果机器 B 调用机器 A 以注册其 IP 地址以进行更新怎么办?那将是一个快速的消息交换。每当机器 A 有数据时,它就可以创建与所有已注册自己的 IP 的新连接并将数据发送给它们。

于 2009-09-09T20:42:17.217 回答
1

查看IP Multicast,尽管您可以通过简单的 UDP 广播来解决问题。

于 2009-09-09T20:55:24.243 回答
0

我会按照你原来的想法去,除了不需要轮询 - B 可以一直保持与 A 的空闲 TCP 连接,然后当 A 想要发送消息时,它只是将它发送给它拥有的所有客户端当时连接。开销不会成为问题——即使是一台相当老的机器也可以同时处理数千个大部分空闲的 TCP 连接。

(如果真实消息之间的间隔超过几分钟,您还需要实现某种保持活动的回显/回显回复类型消息,以便 B 可以快速检测到死连接并重新连接,并避免连接 -从超时开始跟踪防火墙或路由器中的信息)。

于 2009-09-10T22:22:26.910 回答
0

没有静态 IP 意味着它可以从外部访问,但它的地址会发生变化?

如果是这样,那么您可以在A.detach(old_ip); A.attach(new_ip)每次更改地址时让机器 B 调用。

于 2009-09-09T20:43:55.673 回答