观察者在分布式环境中

时间:2009-09-09 20:37:59

标签: tcp distributed messaging observer-pattern

机器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 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

看看IP Multicast,尽管你可以通过简单的UDP广播来实现。

答案 2 :(得分:0)

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

如果是,那么每次更改地址时,您都可以让机器B呼叫A.detach(old_ip); A.attach(new_ip)

答案 3 :(得分:0)

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

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