我为什么要使用JMS而不是RMI + Queue?

Kar*_*ell 8 java queue jms rmi

目前我正在使用RMI或粗体库在我的服务器和客户端之间进行通信(通过LinkedBlockingQueue).现在我读到了可以在这个领域使用的JMS.它是否正确?如果是的话,你介意给我一个简单的优缺点列表,因为它似乎是一个非常复杂和"全面 - 企业"的领域.

有什么好处?与RMI + Queue相比,性能如何呢?JMS能否击败RMI +队列?

PS:我知道有类似的问题,但我希望将JMS与RMI + Queue进行比较.

Enn*_*oji 14

简化比较(不是特别针对JMS,更像是与MQ的比较)...

  1. 自动重试
    如果您是客户端对服务器执行RMI并且由于某种原因RMI失败,则必须自己重试.如果您使用JMS并且您是客户端,则只需发送JMS消息.当无法访问服务器时,将存储您的消息,然后在服务器再次启动时传递.

  2. 持久队列
    由于您使用的是LinkedBlockingQueue,因此您可以在内存中拥有有界队列或无界队列.一旦队列已满,前者将开始捕获线程,并最终在高负载下失败.后者最终会抛出OutOfMemoryError.如果你使用JMS,它可以自动开始"持久化"消息到"持久存储".通常,"持久存储"是DB,它通常比内存中队列容量大得多.当然,当服务器发生故障时,内存中队列的内容会丢失,而在JMS中,您可以选择在此类事件中幸存的持久消息/持久消息.这也允许您进行群集,这对企业程序也非常重要......

  3. 抽象
    你将使用标准化的API(好吧,你也有RMI中的协议,但如果你想要的是传递消息,MQ提供比RMI +内存中队列更多的高级抽象).这意味着,您可以使用JMS的未来实现.也许某些东西不需要DB来提供持久性和持久性,比今天的实现更具可扩展性.或者也许您可以将相同的消息发送到完全不同的服务,因为standerization.基本上,较高的抽象可以为您提供灵活性,RMI +内存中的队列不会.

前段时间,我曾与一家大公司合作,希望利用他们的内部框架来整合我们的东西.那时我们没有使用MQ.我们要求他们使用我们自己的基于RMI的异步协议.相信我,我们非常非常后悔这个决定......


ewe*_*nli 8

其他答案涵盖了JMS的许多方面,但我觉得非常重要的一个需要更多的重点,即JMS 以事务方式支持多个并发消费者.这对我来说是一个杀手锏.

  1. 您可以轻松地构建一个系统,其中包含一个非交易的消费者和生产者.
  2. 您也可以通过更多的工作(或多或少)进行交易.
  3. 同样,您可以相对轻松地添加对多个生产者和单个使用者的支持,例如,如果您使用事务数据库来存储消息.
  4. 但是拥有多个并发消费者并且消息消费是事务性的变得非常困难.这基本上需要一个非平凡的锁定方案,即使使用事务数据库,任务也不容易.

当我们谈到JMS 可伸缩性时,我们会谈到这个:应用程序的能力.服务器添加/删除使用者/生产者来管理负载.

JMS的其他优点是服务质量和管理,例如重新传递尝试,死信息队列,监视等.

如果你真的不需要,一个稍微简单的解决方案可能会起作用.您还可以看到我的另一个答案,其中我提到了类似的问题:为什么选择JMS进行异步解决方案?