我正在创建一个Java应用程序,它需要JVM之间的主从通信,可能驻留在同一台物理机器上。将在Java EE应用程序服务器(即JBoss)内部运行一个“主”服务器,该服务器将“从”客户端连接到它并动态注册自己进行通信(即主服务器将不知道该服务器的IP地址/端口奴隶因此无法提前配置)。主服务器充当控制器,它将向从站执行工作,并且从站将定期响应通知,因此将进行双向通信。
我最初想的是基于RPC的系统,其中每一方都是服务器,但它可能会变得复杂,所以我更喜欢一种机制,其中有一个打开的套接字,它们来回交谈。
我正在寻找一种低延迟的通信机制,其中消息主要是原始类型,因此不需要严重的序列化。以下是我看过的内容:
我缺少什么技术吗?
编辑:还看了看:
答案 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项目以及其他共享的分布式数据结构。