分布式环境中的观察者
机器 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 之外,还有其他方法可以更便宜吗?
Machine A needs to send a message to machine B. Machine A has a static IP but machine B does not.
One option I could think of to solve this problem is that machine B opens a TCP connection to machine A and then machine A sends the data/message to machine B. However, this solution has the following limitations:
a) It is not scalable if there are many such machines as machine B to whom/which the data has be sent. It might be a kill on the resources of machine A.
b) It is machine A that needs to send the data when it wants. Machine B does not know when there will be data for it. In the current design, machine B will have to keep polling machine A repeatedly with a TCP connection asking if it has any data for it or not. This can get expensive if there are many machine B's.
Is there a less expensive way to solve this problem? The Observer design pattern comes to mind. Machine B could subscribe to a notification from machine A to inform it when data becomes available. However, how does one implement the pattern in a distributed environment when machine B does not have a static IP?
Observer aside, is there a way other than using raw sockets for machine A to send that data to machine B, that would be less expensive?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
如果机器 B 调用机器 A 来注册其 IP 地址以进行更新会怎样?这将是一个快速的消息交换。每当机器 A 有数据时,它就可以创建一个到所有已注册的 IP 的新连接并向它们发送数据。
What if machine B makes a call to machine A to register its IP address for updates? That would be a quick message exchange. Whenever machine A has data it could create a new connection to all of the IPs that have registered themselves and send them the data.
请查看 IP 多播,尽管您可能可以通过简单的 UDP 广播来实现。
Look at IP Multicast, though you may be able to get by with simple UDP broadcast.
没有静态IP意味着可以从外部访问它,但是它的地址会改变吗?
如果是,那么您可以让机器 B 调用 A.detach(old_ip); A.attach(new_ip) 每次地址改变时。
Not having a static IP means that it is accessible from outside, but it's address changes?
If it does, then you can have the machine B call
A.detach(old_ip); A.attach(new_ip)
every time the address is changed.我同意你最初的想法,除了不需要轮询 - B 可以始终保持与 A 的空闲 TCP 连接,然后当 A 想要发送消息时,它只需将其发送给它拥有的所有客户端那时连接的。开销不会成为问题——即使是相当旧的机器也可以处理数千个同时大部分空闲的 TCP 连接。
(如果真实消息之间的间隔超过几分钟,您还需要实现某种保持活动的回显/回显回复类型消息,以便 B 可以快速检测到死连接并重新连接,并避免连接 -跟踪防火墙或路由器中超时路径中的信息)。
I'd go with your original idea, except that there's no need to poll - B can just maintain an idle TCP connection to A at all times, then when A wants to send a message it just sends it out to all the clients it has connected at that time. Overhead won't be a problem - even a fairly old machine can handle thousands of simultaneous mostly-idle TCP connections.
(You'll also want to implement some kind of keep-alive echo / echo reply type messages if the gaps between real messages are longer than a few minutes, so that B can quickly detect a dead connection and reconnect, and to avoid connection-tracking information in firewalls or routers in path from timing-out).