基于Java的应用程序的Discovery mechanics API

时间:2009-12-09 09:22:01

标签: java api tcp udp cluster-computing

我目前参与的项目中,我们/应用程序需要能够发现在LAN上运行相同应用程序名称的应用程序的其他实例(以下称为Node)。

先决条件: 所有节点都知道自己的IP地址和TCP端口号 所有节点都有一个名称 所有节点都可以访问LAN

我需要什么:

所有节点都需要知道每个其他节点的IP地址和TCP端口。 如果节点出现故障,我将不得不以编程方式通知此情况。 如果出现新节点,我将不得不以编程方式通知此情况。 它的基本原理是不需要主服务器或其他应用程序,它必须是我可以集成到当前应用程序中的API。 此外,它必须是开源的,最好是MIT或ApacheV2许可。

这就是全部!

该应用程序是基于JVM的,因此任何API都可以。我一直在关注ZooKeeper,但它似乎对我们需要的小功能非常依赖。

而且,如果您不知道任何API,但有一些很好的链接可以分享,如何通过自己编写(白皮书,博客,书籍等等)来实现这一点,我非常乐意接受像那还是。

所以问题是, 我该怎么做?

4 个答案:

答案 0 :(得分:5)

我肯定会推荐JGroups非常好,并且非常积极参与并支持任何类型的发现(IP多播,固定列表,外部查找服务等) 。

另一个选项是Apache MINA,但JGroups更适合发现IMO(因为它支持任何类型的发现)。

答案 1 :(得分:2)

如果你们都在同一个子网上,一个简单的解决方案就是使用multicast sockets。选择一个地址(好吧,使其可配置),然后当一个新实例启动时,它发送一个多播“ping”。这会通知其他服务器。

当然,这不会告诉你何时实例出现故障。你有两个选择:

  1. 经常ping,当你在一段时间内没有收到ping时,你认为实例已经关闭;或
  2. 当您收到新实例的通知时,您将打开与该实例的TCP连接。你必须更频繁地ping那个套接字才能使它保持打开状态(不活动最终仍然会终止它),并且可以通知你它被另一方关闭或者套接字超时的TCP语义。
  3. 您需要1-2个线程来监控此事并触发相应的事件。

答案 2 :(得分:1)

对于这类事情有很多选择,我最喜欢的是hazelcast它获得了Apache许可,并且没有依赖关系和最少的配置。

更成熟的选项是jgroups,这是根据LGPL许可的。

答案 3 :(得分:1)

绝对最简单的方法 - 在我看来最简单 - 这样做是使用ZeroConf!

每个节点宣布自己,并在别人出现和消失时听取。没有中央注册表,只是多播DNS。效果非常好 - 只需看看OS X.

便携式方法是使用jmdns - http://jmdns.sourceforge.net/ - OS X的方式是使用Apple Java外观。