JMS/消息队列的实际应用是什么?

188

我刚刚在阅读有关JMS和Apache ActiveMQ的内容,想知道这里的人们使用JMS或类似的消息队列技术的真实世界用途是什么?

11个回答

198

JMS(ActiveMQ是JMS代理实现)可用作机制,允许异步请求处理。您可能希望这样做是因为请求需要很长时间才能完成或多个方可能对实际请求感兴趣。使用它的另一个原因是允许多个客户端(可能编写在不同的语言中)通过JMS访问信息。ActiveMQ在此处是一个很好的示例,因为您可以使用STOMP协议允许C#/Java/Ruby客户端访问。

一个真实的例子是一个用于为特定客户下订单的Web应用程序。在下订单(并将其存储到数据库中)的过程中,您可能希望执行一些其他任务:

  • 将订单存储在某种第三方后端系统中(例如SAP)
  • 向客户发送电子邮件以通知他们已经下了订单

为了做到这一点,您的应用程序代码将发布一个包含订单ID的消息到JMS队列中。监听队列的应用程序的一部分可能会通过获取订单ID,在数据库中查找该订单,然后将该订单放置到另一个第三方系统中。您的应用程序的另一部分可能负责获取订单ID并向客户发送确认电子邮件。


嗨@jon,你看过这个文档标签吗?https://stackoverflow.com/documentation/jms/commit 他们只需要一个提交者的支持来启用该主题,我认为你可能是那个人 :) 谁能让他们为我们提供关于JMS的精彩文档。 - juanmf
@Jon,据我所知,JMS本身就是企业集成模式的一种实现? - valik
不,Mule或Camel都不是... - Jonathan Holloway
2
如果有任意数量的应用程序可能正在消费队列中的消息,那么队列如何知道何时删除旧消息? - Basil Bourque

99

这些技术常用于异步处理长时间运行的操作。网页用户不希望等待超过5秒钟来处理请求。如果您有一个比这更长的请求,一种设计方法是将请求提交到队列中,并立即返回一个URL,供用户检查作业何时完成。

发布/订阅是另一种很好的解耦发送者和多个接收者的技术。这是一种灵活的架构,因为订阅者可以根据需要随时加入或退出。


41
读完你的回答后,我打算把JMS加入到我的“今年要学习的队列”中 :) - Roman
现在,我们可以使用异步方法调用来代替使用JMS规范。更多信息请参见:https://docs.oracle.com/javaee/6/tutorial/doc/gkkqg.html - user711189
4
它们并不完全相同。使用异步方法调用没有保证的传送;也没有可以同时发送给多个监听器的主题概念。 - duffymo

77

我已经有很多关于JMS的令人惊奇的用途:

  • 用于客户服务的Web聊天通讯。

  • 后端调试日志记录。所有应用服务器会以各种不同级别广播调试消息。然后可以启动JMS客户端来监视调试消息。当然,我也可以使用类似于 syslog 的东西,但是它为我提供了各种基于上下文信息(例如按应用服务器名称、API调用、日志级别、用户ID、消息类型等)过滤输出的方法。我也给输出加上颜色。

  • 将调试日志记录到文件。与上面相同,只是使用过滤器从中提取出特定部分,并记录到文件进行一般日志记录。

  • 警报。再次,类似于上面的日志记录设置,观察特定错误并通过各种方式(电子邮件、短信、即时消息、Growl弹出窗口等)通知相关人员。

  • 动态配置和控制软件群集。每个应用服务器都会广播“配置我”消息,然后一个配置守护程序会响应一个包含各种配置信息的消息。稍后,如果需要一次更改所有应用服务器的配置,可以从配置守护程序中完成。

  • 常规用途 - 用于排队的事务以进行延迟活动,例如计费、订单处理、供应、电子邮件生成等。

JMS非常适用于任何需要异步传递消息并保证交付的地方。


7
对我来说,使用JMS进行调试日志记录似乎不合适。队列和消息传递的成本很高,而日志记录(通常会记录大量信息以进行调试)必须尽可能快。 - Marco Altieri

19
分布式(异步)计算。一个真实的例子可以是应用程序级别的通知框架,该框架在应用程序使用过程中的各个时间点向利益相关者发送邮件。因此,应用程序将作为“生产者”创建一个“消息”对象,将其放在特定的“队列”上,并继续前进。会有一组“消费者”订阅所涉及的“队列”,并处理发送的“消息”。请注意,在此事务过程中,“生产者”与处理给定“消息”的逻辑分离。消息框架(如ActiveMQ等)作为骨干提供“消息代理”来促进这种“消息”交易。

我想要异步处理,因为RestService Api是同步的。如何使用ActiveMq和Jms实现?请在这方面提供帮助。https://dev59.com/oHjZa4cB1Zd3GeqPgJwA 。感谢您的帮助和时间。 - Kumar

10
我曾使用它在不同的基金管理系统之间发送日内交易。如果你想了解更多关于伟大技术消息传递的内容,我强烈推荐书籍"企业集成模式"。其中包含一些JMS示例,例如请求/响应和发布/订阅。
消息传递是集成的一个极好工具。

8

我曾经用它来完成我的学术项目,这个项目是一个类似于亚马逊的在线零售网站。 JMS被用于处理以下功能:

  1. 更新客户下单的订单位置,随着货物从一个地方到另一个地方的运输而变化。这是通过不断向JMS队列发送消息来完成的。
  2. 警报任何异常事件,例如货物延迟并向客户发送电子邮件。
  3. 如果交付到达目的地,则发送交付事件。

我们还实现了连接到主服务器的多个远程客户端。如果有连接可用,它们将访问主数据库,否则使用自己的数据库。为了处理数据一致性,我们实现了2PC机制。 为此,我们使用JMS在这些系统之间交换消息,即一个充当协调员的系统通过在队列上发送消息来启动过程,其他系统将根据需要再次通过队列发送消息进行响应。 正如其他人已经提到的那样,这与发布/订阅模型类似。


8
我们使用它来启动异步处理,这样就不会中断或与现有事务冲突。
例如,假设您有一个昂贵且非常重要的逻辑,比如“购买商品”,其中的一个重要部分是“通知商店”。我们将通知调用设置为异步,以便涉及通知调用的任何逻辑/处理不会阻塞或争夺购买业务逻辑的资源。最终结果是购买完成,用户感到满意,我们得到了钱,并且由于队列保证交付,商店在开放或队列中有新项目时立即得到通知。

1
请帮忙解决这个问题。 https://dev59.com/oHjZa4cB1Zd3GeqPgJwA 。感谢您的帮助和时间。 - Kumar
2
但由于请求是异步的,因为网络问题,您的消息可能无法发送。这怎么办?当您想购买物品时,您的通知必须发送,不是吗? - grep

6

Apache Camel与ActiveMQ结合使用是实现企业集成模式的好方法。


6

我曾在不同的商业和学术项目中看到过JMS的使用。当您需要一个完全解耦的分布式系统时,JMS可以很容易地进入您的视野。一般来说,当您需要从一个节点发送请求,而您网络中的某个人负责处理它而不/或者给发送者有关接收方的任何信息时,JMS就会派上用场。

在我的情况下,我在我的论文中开发了一个面向消息的中间件(MOM),其中特定类型的面向对象的对象在一侧生成作为您的请求,在另一侧编译并执行作为您的响应。


5
我们使用消息传递来生成在线报价。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接