在lan上向所有人广播

时间:2013-01-12 17:45:17

标签: java udp thrift zeromq

我正在尝试联系LAN上的所有人,以发现哪些设备当前正在使用ip并运行我的服务。运行该服务的每台设备都会知道哪些设备上线时连接了哪些设备。我有基本的网络经验(tcp / udp),但我没有做更多复杂的通信包。我想发布我迄今为止所研究/尝试过的内容,并获得一些专家回复,以限制我对未来潜在解决方案的试错时间。

要求:

  • 目前使用java,但需要跨语言沟通。
  • 必须在可接受的时间范围内(最多几秒钟)完成,最好是可靠的。
  • 我想在广播和以后的通信中使用类似的技术,以避免引入多个包/技术的额外复杂性。
  • 目前我正计划通过心跳来识别仍然连接的ip,但我可能希望以后继续向局域网广播。
  • 我有兴趣为这项服务使用跨语言rpc通信,但这种技术不一定要使用它。
  • 以后的通讯(非广播)必须可靠。

研究和尝试的事情:

  • UDP - 担心跨语言交流,缺乏可靠的交付,并会增加另一种沟通方式,而不是像下面那样使用一种解决方案。如果能找到另一个更完整的解决方案,我宁愿避免使用它。

  • Apache Thrift - 目前我已经尝试迭代所有潜在的ip并尝试连接到每个。这太慢了,因为每次尝试连接的超时都很长(当我打开时)。我还没有找到任何广播选项。

  • ZeroMQ - 使用基本的zeromq完成了很少的测试,但我过去只使用过它的包装器。 pub / sub功能似乎对这种情况很有用,但我担心订阅lan中的每个ip。还担心在尝试订阅尚未运行服务的ip时会发生什么。

根据我的要求,这些建议中的任何一项似乎都会比其他建议更好吗?您对可能更好的技术有什么其他建议吗?

感谢。

3 个答案:

答案 0 :(得分:7)

你指定的基本上是两个独立的问题;发现/监控和服务提供商。由于这两个问题有些正交,我将使用两种不同的方法来实现它。

发现/监测

让每个设备在预定义端口上通过UDP在LAN上连续广播(小)心跳/状态消息。此心跳应包含设备的ip / port(发送方)以及其他有趣数据,例如此设备提供的服务的地址(URL)。如果需要降低带宽利用率,请选择紧凑的消息格式,例如协议缓冲区(可用于多种语言)或JSON以提高可读性。这些信息应定期发布,例如每隔5秒发布一次。

现在,让每个设备收听广播地址上的传入消息,并保留所有已知设备的内存映射[发送者,最后记录时间+其他数据]。迭代地图说每秒钟并删除已经静音x个心跳间隔(例如3 x 5秒)的发件人。这样,每个节点都将知道所有其他响应节点。

您不必了解任何IP:s,不需要任何额外的目录服务器,也不需要迭代所有可能的IP地址。此外,通过UDP发送/接收数据比通过TCP简单得多,并且不需要任何连接。它还可以减少开销,减少带宽利用率。

服务提供商

我假设您希望在此处提出某种请求 - 响应。为此,我将选择一个简单的基于REST的API,通过HTTP,谈论JSON。如果您的有效负载相当大,请为协议缓冲区切换JSON有效负载,但在大多数情况下,JSON可能会正常工作。

总而言之,这将为您提供可靠,高效,可靠,跨平台且简单的解决方案。

答案 1 :(得分:3)

在ZeroMQ指南(第8章)中查看Zyre项目。它是一个相当完整的本地网络发现和消息框架,一步一步开发。您绝对可以重用UDP广播和发现,也可以重用其余部分。还有一个完整的Java实现,https://github.com/zeromq/zyre

答案 2 :(得分:1)

我会使用JMS,因为它可以跨平台(至少对于客户端)你仍然需要决定如何编码数据,除非你有特定的想法,我会使用XML或JSon,因为这些很容易阅读和检查

您可以使用ZeroMQ获得更高的性能和更低级别的访问权限。除非你知道你需要这个,否则我怀疑你没有。

您可能会受益于JMS的更高级功能。

BTW:这些服务隐含地进行服务发现。没有特别需要(监控除外)了解IP地址或服务是上升还是下降。他们的设计假设您希望不必了解这些细节。