父节点和子节点之间的通信

3
我们有一个父节点,保存关于许多节点的信息。每个节点是一个单独的VM实例,执行不同的任务。 父节点就像所有节点的仪表板。 父节点需要:
  • 向某些节点发送偶尔的配置更改
  • 监视心跳,即节点的健康状况
  • 节点获取一些统计数据
我希望节点尽可能地不知道外部世界。每个节点都作为Web服务器运行,它们有时会有大量流量。
如何在父节点节点之间以最佳方式通信?
我考虑使用文件进行通信,因此父节点可以在节点文件系统上设置具有命令的文件,然后有一个目录观察器读取这些文件。
或者在后台拥有一些事件总线/消息队列,但它们正在使用套接字,因此在高流量情况下,节点父节点的消息可能变得无响应。或者我太担心了?
编辑
是否有任何事件/消息总线可以在通道之间提供直接通信,以节省广播时间?在我的示例中,通信始终在父节点和单个子节点之间进行,没有必要进行广播。因此,我们可以有类似电子邮件的一些消息传递 ;)
编辑#2-关于通信和流量
有一个父节点(或代表父节点的集群)。 子节点的数量未确定,它可以是任何数量;目标是尽可能多,只要系统正常工作即可。通信如下:
  1. 命令(parent -> child) 低频命令,通常由管理员启动(例如“重新启动”,“上传”,“重新加载配置”)。它直接发送到特定的child

  2. 运行时统计信息(每个child -> parent) 每个childparent通报其健康状况(心跳)和一些次要统计信息。这不必是实时通信,只要消息在例如10秒内传输即可。

  3. 运行时日志(每个child -> parent) 有关流量和使用情况的重要日志。这可能是高容量数据,因为重要的是测量每个节点,如果计算超过某个限制,我们需要意识到这一点等等。同样,并非实时,但我们需要及时警报高计算。

没有太多需要进行广播(因为child不知道其他子节点),这是更直接的消息传递。


你有多少节点?你从父节点发送哪种数据? - dieter
更新的问题,@dit - igr
2个回答

1
我建议您使用RMI,因为您可以实现需要在节点之间通信的方法,使要通信的类扩展Remote接口。
您将不得不在通信开始时使用rmiregistry,但是如果您有一个“中央”节点来分发引用/消息(如聊天(服务器/客户端)模型),则不再需要它。 更新:我不太高级,无法回答您的最后一个问题,但也许这些链接可以帮助您找出是否需要它:
1.- 概述 2.- RMI有多快?

RMI在日常使用中,多节点环境下有多强健?消息的负载有多轻? - igr
例如,我知道 JMS 应用程序的平均响应时间增加远低于 RMI 应用程序。 - igr
更新了一些链接@игор,希望第二个链接可以澄清你所需的内容。 - Btc Sources

1
也许最简单的解决方案是向节点发送HTTP POST请求来更改配置(特别是如果它已经是Web服务器)。心跳可以使用HEAD请求。收集统计信息的请求可能是GET。
您可以使用Servlet安全机制确保只有父级更改了配置。
如果您遇到性能问题,则像RMI或ZeroMQ这样的解决方案可能很好,但会引入额外的复杂性。
像这个https://code.google.com/p/google-http-java-client/一样的优秀HTTP客户端库可以让您走得更远。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接