我们有一个parent
,其中包含许多nodes
的信息。每个节点都是独立的VM实例,执行不同的任务。 parent
就像是所有节点的仪表板。
parent
需要:
node
node
node
我希望node
尽可能不了解外面的世界。每个node
都可以作为网络服务器使用,有时会产生很大的流量。
如何在parent
和node
之间以最佳方式进行沟通?
我正在考虑使用文件进行通信,因此parent
可以在node
文件系统上使用命令设置文件,然后让dir监视器读取这些文件。< / p>
或者在后台有一些事件总线/消息队列,但他们正在使用套接字,因此node
对于parent
消息可能会在高流量时无响应。或者我担心太多了?
修改
是否有任何事件/消息总线提供频道之间的直接通信,以节省广播时间?在我的示例中,之间的通信始终在parent
和单child
之间,不需要广播。所以我们可以像电子邮件一样发送消息;)
编辑#2 - 关于沟通和交通
有一个parent
(或代表父项一个实例的集群)。 childs
的数量未确定,可能是任意数量;只要系统正常工作,目标就是尽可能多地拥有。沟通是:
命令(parent
- &gt; child
)
低频率命令,通常由管理员发起(例如&#34;重启&#34;,&#34;上传&#34;,&#34;重新加载配置&#34;)。它直接转到特定的child
。
运行时统计信息(每个child
- &gt; parent
)
每个child
都会通知parent
有关其健康状况(心跳)和一些次要统计信息。这不必是实时通信,只要消息在例如传输下传输即可。 10秒。
运行时日志(每个child
- &gt; parent
)
有关流量和使用情况的重要日志。这可能是高容量数据,因为测量每个节点很重要,如果计算超过一定限度,我们需要注意等等。再次,不是实时,但我们需要在高计算时及时发出警报。 / p>
不需要一般广播(因为child
不知道其他孩子),这是更直接的消息。
答案 0 :(得分:1)
我建议您使用RMI,因为您可以实现节点之间需要进行通信的方法,使您想要通信的类扩展Remote
接口。
您必须在通信开始时使用rmiregistry
,但如果您有一个“中心”节点来分发引用/消息(例如在聊天中),那么将不再需要它(服务器/客户端)模型)。
更新:我不是那么先进,无法回答您的上一个问题,但也许这些链接可以帮助您了解这是否是您需要的:
1.- Overview
2.- How fast RMI?
答案 1 :(得分:1)
也许最简单的解决方案是向节点发送http POST以更改配置(特别是如果它已经是Web服务器)。心跳可能只是HEAD请求。统计信息收集请求可能是获取。
您可以使用servlet安全机制来确保配置仅由父级更改。
如果遇到性能问题,像RMI或ZeroMQ这样的解决方案可能会很好,但它会带来额外的复杂性。
像这样一个https://code.google.com/p/google-http-java-client/的好的http客户端库可以帮到你。