什么是一个很好的基于Java的主从通信机制?

时间:2010-04-07 18:15:09

标签: java jms rmi rpc master-slave

我正在创建一个Java应用程序,它需要JVM之间的主从通信,可能驻留在同一台物理机器上。将在Java EE应用程序服务器(即JBoss)内部运行一个“主”服务器,该服务器将“从”客户端连接到它并动态注册自己进行通信(即主服务器将不知道该服务器的IP地址/端口奴隶因此无法提前配置)。主服务器充当控制器,它将向从站执行工作,并且从站将定期响应通知,因此将进行双向通信。

我最初想的是基于RPC的系统,其中每一方都是服务器,但它可能会变得复杂,所以我更喜欢一种机制,其中有一个打开的套接字,它们来回交谈。

我正在寻找一种低延迟的通信机制,其中消息主要是原始类型,因此不需要严重的序列化。以下是我看过的内容:

  • RMI
  • JMS:内置于Java,“slave”客户端将连接到应用程序服务器中的现有ConnectionFactory。
  • JAX-WS / RS:主服务器和从服务器都是服务器,为双向通信提供RPC接口。
  • JGroups / Hazelcast:使用共享的分布式数据结构来促进沟通。
  • Memcached / MongoDB:使用这些作为“队列”来促进沟通,虽然客户端必须进行轮询,因此会有一些延迟。
  • Thrift:这似乎保持持久连接,但不确定如何将Thrift服务器集成/嵌入JBoss
  • WebSocket / Raw Socket:这可行,但需要比我想要的更多自定义代码。

我缺少什么技术吗?

编辑:还看了看:

  • JMX:让客户端连接到JBoss的JMX服务器并接收双向通信的JMX通知。

11 个答案:

答案 0 :(得分:5)

好吧,如果您正在寻找基于Java的东西,我建议使用JMS。它具有您正在寻找的所有功能以及强大的应用程序服务器,如JBoss。但是,另一个不完全基于Java并且不使用Queues的选项将使用HTTP协议和JAXB(RESTful Web服务)。这是双方沟通的一种非常轻松的方式。您的对象将使用JAXB转换为XML,并将转移到另一侧,然后在收到对象后将其转换回对象。

答案 1 :(得分:4)

老实说,我会坚持使用JMS。您有一个队列,您的从属可以从中获取消息,以及一个队列,他们将它们放回去。您可以在信封上设置有关谁处理每条消息(用于记帐)的属性。您可以获得许多J2EE提供程序(glassfish,jboss)的持久性。

另外,您可以轻松地使用它移动到多服务器分布式JVM,无需额外编程。

但是,在某些情况下,它可能不符合“低延迟”的定义。

答案 2 :(得分:3)

还有两个选择:

Zookeeper(http://hadoop.apache.org/zookeeper/)没有使用它,但听起来合适。 RabbitMQ(http://www.rabbitmq.com/)低延迟消息队列。这里有很多灵活性。

答案 3 :(得分:3)

如果您正在寻找性能而且两个应用程序都是java,而且两者之间没有防火墙,那么您可以立即排除所有基于XML的协议。 如果通信是同步的(主设备等待从设备完成作业),则使用RMI,否则使用JMS。 您还可以直接使用TCP以获得最佳性能。 如果有许多从站接收相同的消息,您可以查看组通信工具包,如JGroups或Spread(更快但不是100%java)。 最终,您可能会发现其他人已经构建了您正在构建的内容。看一下Gridgain。

答案 4 :(得分:1)

您也可以查看骡子。我觉得这是解决问题的完美方案。

答案 5 :(得分:0)

我们有一个类似的应用程序,我们只是在JBoss上使用Servlet,其中“slaves”以定时器驱动的方式命中它。这没关系,但不适合低延迟。

我们正在调查Netty。您可以使用您想要使用的任何协议。我们可能会使用HTTP和JAXB。我想这可以归类为“WebSocket / Raw Socket”,但它比使用原始套件要好得多..

答案 6 :(得分:0)

您可能想看一下Activatable。如果工作完成后奴隶正在响应,那么在这种情况下rmi和Activatable可能是一个很好的解决方案。如果您在控制器上使用rmiregistry,那么所有从站都可以轻松地向控制器注册,并且可以在需要时激活它们。

答案 7 :(得分:0)

根据您的要求,您可能会发现Raw Socket的代码比其他方法少 。它肯定会有最低的延迟。您可以通过环回将其降低到大约20微秒。

您拥有的要求越多,您就越有可能获得高水平的解决方案。但是,如果您想要的只是轻量级的,那么原始套接字可能是最简单的。

答案 8 :(得分:0)

对于节俭,你可以使用TServlet作为Thrift服务的入口点。你所描述的虽然听起来更像是一个用activemq或zookeeper解决的问题。

答案 9 :(得分:0)

WebSockets将帮助您在Web服务器和客户端之间进行通信,而不是在两个JVM之间进行通信。如果这实际上是你想要的,http://fermiframework.org提供了一个java到JavaScript(服务器到客户端)的RMI。

答案 10 :(得分:0)

您还可以查看已发布/订阅的Redisson项目以及其他共享的分布式数据结构。