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

我刚刚在读关于 JMS 和 ApacheActiveMQ 的文章。 想知道现实世界中人们使用 JMS 或类似的消息队列技术有什么用处吗?

122584 次浏览

始终使用它们异步处理长时间运行的操作。一个 web 用户不会愿意等待超过5秒的时间来处理一个请求。如果您有一个运行时间超过这个时间的请求,一种设计是将请求提交到一个队列,然后立即发回一个 URL,用户可以检查这个 URL,以查看作业何时完成。

发布/订阅是将发送方与许多接收方分离的另一种好技术。这是一个灵活的体系结构,因为订阅者可以根据需要来来去去。

分布式(a)同步计算。
一个真实的例子可以是应用程序范围的通知框架,它在应用程序使用过程中的不同时间点向涉众发送邮件。因此,应用程序将作为一个 Producer创建一个 Message对象,把它放在一个特定的 Queue上,然后继续前进。
将会有一组 Consumers 订阅相关的 Queue,并小心处理发送过来的 Message。请注意,在这个事务过程中,Producer与如何处理给定 Message的逻辑是解耦的。
消息传递框架(ActiveMQ 等)充当骨干,通过提供 MessageBroker来促进这样的 Message事务。

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

一个真实的例子是一个 Web 应用程序,它用于为特定的客户下订单。作为下订单(并将其存储在数据库中)的一部分,您可能希望承担一些额外的任务:

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

为此,应用程序代码将把消息发布到包含订单 ID 的 JMS 队列中。侦听队列的应用程序的一部分可能会通过接受 orderId 来响应事件,在数据库中查找订单,然后将该订单放到另一个第三方系统中。应用程序的另一部分可能负责接收 orderId 并向客户发送确认电子邮件。

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

我对 JMS 有很多惊人的用途:

  • 面向客户服务的网络聊天交流。

  • 调试后端的日志记录。所有应用程序服务器在不同级别广播调试消息。然后可以启动 JMS 客户机来监视调试消息。当然,我可以使用类似于 Syslog的东西,但是这给了我基于上下文信息过滤输出的各种方法(例如,通过应用服务器名称、 API 调用、日志级别、用户标识、消息类型等等)。.).我还对输出进行了彩色处理。

  • 调试日志记录到文件。与上面一样,只有特定的部分使用过滤器提取出来,并记录到文件中以便进行一般日志记录。

  • 警报。同样,对上面的日志进行类似的设置,监视特定的错误,并通过各种方式(电子邮件、文本消息、即时通讯、咆哮弹出窗口...)提醒人们

  • 动态配置和控制软件集群。每个应用服务器将广播一个“ configure me”消息,然后是一个配置守护进程,它将用一个包含各种配置信息的消息进行响应。稍后,如果所有的应用服务器都需要立即更改它们的配置,那么可以通过配置守护进程来完成。

  • 通常排队的事务延迟活动,如计费,订单处理,供应,电子邮件生成..。

在任何需要保证消息异步传递的地方都可以使用它。

我们使用它来启动异步处理,我们不希望中断或与现有的事务发生冲突。

例如,假设你有一个昂贵而且非常重要的逻辑,比如“购买东西”,购买东西的一个重要部分就是“通知商店”。我们将通知调用设置为异步的,以便通知调用中涉及的任何逻辑/处理都不会阻塞或与 Buy 业务逻辑争用资源。最终结果,购买完成,用户很高兴,我们得到了我们的钱,因为队列是保证交付的商店得到通知,一旦它打开或有一个新的项目在队列中。

我见过 JMS 在不同的商业和学术项目中使用。只要您希望拥有一个完全解耦的分布式系统,就可以轻松地使用 JMS。一般来说,当您需要从一个节点发送请求时,您的网络中的某个人会在不向发送方提供任何有关接收方的信息的情况下处理该请求。

在我的例子中,我在我的论文中使用了 JMS 来开发一个面向消息的中间件(MOM) ,其中面向对象的特定类型在一边生成,作为你的请求,在另一边编译和执行,作为你的响应。

我用它来发送不同基金管理系统之间的日内交易。如果你想了解更多关于什么是一个伟大的技术信息,我可以彻底推荐的书“ 企业集成模式”。有一些关于请求/回复和发布/订阅的 JMS 示例。

消息传递是一个优秀的集成工具。

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

我们使用 JMS 通过不可靠的网络与大量远程站点中的系统进行通信。松散耦合与可靠的消息传递相结合产生了一个稳定的系统景观: 每个消息将尽快在技术上可能的发送,网络中的较大问题将不会对整个系统景观产生影响..。

我已经使用它为我的学术项目,这是在线零售网站类似于亚马逊。 JMS 用于处理以下特性:

  1. 随着货物从一个地点运往另一个地点,更新客户订单的位置。这是通过不断地向 JMSQueue 发送消息来完成的。
  2. 提醒任何不寻常的事件,如发货延迟,然后发送电子邮件给客户。
  3. 如果传递到达其目的地,则发送一个传递事件。

我们有多个也已实现的远程客户端连接到主服务器。如果连接可用,则用于访问主数据库,如果不使用自己的数据库,则用于访问主数据库。为了处理数据的一致性,我们实现了2PC 机制。 为此,我们使用 JMS 在这些系统之间交换消息,即作为协调器的一个系统将通过向队列发送消息来启动流程,其他系统将通过再次向队列发送消息来相应地作出响应。 正如其他人已经提到的,这类似于发布/订阅模式。