【发布时间】:2013-01-13 08:20:54
【问题描述】:
我正在尝试联系 LAN 上的每个人,以了解哪些设备当前正在使用该 ip 并运行我的服务。运行该服务的每台设备都会在它们上线时知道哪些其他设备已连接。我有基本的网络经验(tcp/udp),但我对更复杂的通信包做得不多。我想发布我迄今为止研究/尝试过的内容,并获得一些专家的回复,以限制我在未来潜在解决方案上的试错时间。
要求:
- 目前使用 java,但需要跨语言交流。
- 必须在可接受的时间范围内完成(最多几秒)并且最好是可靠的。
- 我希望在广播和后续通信中使用类似的技术,以避免引入多个包/技术的额外复杂性。
- 目前我正计划向已知 ip 发送心跳信号以提醒仍然连接,但我可能希望稍后继续向局域网广播。
- 我有兴趣为此服务使用跨语言 rpc 通信,但这种技术不一定非要使用它。
- 以后的通信(非广播)必须可靠。
研究和尝试的事情:
UDP - 担心跨语言通信、缺乏可靠的传递,并且会添加另一种通信方式,而不是使用如下所示的一种解决方案。如果可以找到另一个更完整的解决方案,我宁愿避免它。
Apache Thrift - 目前我已经尝试遍历所有潜在的 ip 并尝试连接到每一个。这太慢了,因为每次尝试连接的超时都很长(当我调用 open 时)。我还没有找到任何广播选项。
ZeroMQ - 使用基本的 zeromq 进行的测试很少,但我过去只使用过它的包装器。 pub/sub 功能似乎对这种情况很有用,但我担心订阅局域网中的每个 ip。还担心尝试订阅尚未运行服务的 ip 时会发生什么。
考虑到我的要求,这些建议中的任何一个似乎比其他建议更有效吗?您还有什么其他可能会更好的技术建议吗?
谢谢。
【问题讨论】:
-
UDP 和跨语言通信在这里真的无关紧要:现在所有的服务发现协议都使用 UDP。如果有一个没有,我想听听。另外,在谈到 TCP/IP 堆栈时,UDP 是第 3 级,而您引用的其他协议是第 4 级。
-
哦,现在常用的三级协议,反正只有UDP可以做广播。 TCP 做不到。
-
谢谢@fge。我意识到协议级别的差异,我只是想列出我所研究的内容(也许有点不雅)。附带问题:鉴于应用程序层选项,今天在大型生产代码中仍然使用简单套接字是否普遍?考虑到今天的选择,这似乎相当有限。谢谢。
-
不幸的是,很多这些现有选项都推测您使用 HTTP。您实际上需要两件事:服务发现机制和服务提供机制。最简单的部分是第二部分……如果您希望使用“HTTP 覆盖”。确实存在利用现有服务发现协议的 Java 库,但据我所知,数量并不多。顺便说一句,我很惊讶您在研究中没有偶然发现 UPnP 或 Bonjour。
-
谢谢@fge。这两个选项都给了我一些思考。我很惊讶服务发现是一个如此复杂的问题......我认为它会相对容易。