真实世界中使用JMS /消息队列?

我只是读了关于JMS和Apache ActiveMQ的升技。 并想知道在这里人们使用JMS或类似的消息队列技术的真实世界使用?

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

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

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

为此,您的应用程序代码会将消息发布到包含订单ID的JMS队列中。 应用程序监听队列的一部分可能会通过orderId响应事件,在数据库中查看订单,然后将该订单与另一个第三方系统进行比较。 您的应用程序的另一部分可能负责采取orderId并发送确认电子邮件给客户。

一直使用它们来asynchronous处理长时间运行的操作。 networking用户不会希望等待超过5秒的时间才能处理请求。 如果有一个运行时间比这个长,那么一种devise是将请求提交给一个队列,并立即发回一个URL,用户可以检查该URL以查看作业何时完成。

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

JMS有很多令人惊叹的用途:

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

  • 在后端debugging日志logging。 所有的应用程序服务器都在各个级别上广播debugging消息。 然后可以启动JMS客户端来观察debugging消息。 当然,我可以使用像syslog这样的东西,但是这给了我很多方式来根据上下文信息(例如应用服务器名称,api调用,日志级别,用户标识,消息types等等)过滤输出。 我也彩色输出。

  • debugging日志到文件。 和上面一样,只有特定的部分使用filter拉出,并logging到通用日志logging文件中。

  • 警报。 再次,类似的设置上述日志logging,注意特定的错误,并通过各种方式(电子邮件,短信,即时通讯,咆哮popup…提醒人们)

  • dynamicconfiguration和控制软件集群。 每个应用程序服务器都会广播一个“configuration我”消息,然后是一个configuration守护进程,它会响应包含各种configuration信息的消息。 之后,如果所有应用程序服务器都需要一次更改其configuration,则可以从configuration守护程序完成。

  • 而通常排队的交易延迟活动,如计费,订单处理,供应,电子邮件生成…

在任何你想保证asynchronous传递消息的地方都很棒。

分布式(a)同步计算。
一个真实世界的例子可能是一个应用程序范围的通知框架,在应用程序使用过程中,这个通知框架会在不同的地方向相关人员发送邮件。 所以应用程序将作为一个Producer通过创build一个Message对象,把它放在一个特定的Queue ,并向前移动。
将会有一组Consumer订阅有问题的Queue ,并且会小心处理发送的Message 。 请注意,在此交易过程中, Producer与给定Message如何处理的逻辑是分离的。
消息框架(ActiveMQ等)充当骨干,通过提供MessageBroker来促进这种Message交易。

我用它在不同的基金pipe理系统之间进行盘中交易。 如果你想了解更多的技术信息是什么,我可以彻底推荐“ 企业集成模式 ”一书。 有些请求/回复和发布/订阅的JMS示例。

消息传递是一个很好的集成工具。

我们使用它来启动asynchronous处理,我们不想中断或冲突现有的事务。

例如,假设你有一个昂贵而又非常重要的逻辑,比如“买东西”,买东西的一个重要部分就是“通知东西商店”。 我们使通知调用是asynchronous的,以便在通知调用中涉及的任何逻辑/处理都不会阻止或与购买业务逻辑竞争资源。 最终结果,购买完成,用户感到高兴,我们得到了我们的钱,并且因为队列是有保证的交付,所以一旦商店开放,或者一旦有新的商品在队列中,商店就会得到通知。

我已经看到JMS用于不同的商业和学术项目。 只要你想拥有一个完全分离的分布式系统,JMS可以很容易地进入你的图片。 一般来说,当您需要从一个节点发送您的请求时,您的networking中的某人会在发送方不给予发送方有关接收方的任何信息的情况下进行处理。

就我而言,在我的论文中,我使用JMS开发了一个面向消息的中间件(MOM),根据您的请求在一侧生成特定types的面向对象,并在另一侧编译并执行响应。

我用它来做我的学术项目,这个在线零售网站与亚马逊相似。 JMS被用来处理以下function:

  1. 当货物从一个地点运送到另一个地点时,更新客户下订单的位置。 这是通过不断地发送消息到JMS队列来完成的。
  2. 警惕任何不正常的事件,如发货延迟,然后发送电子邮件给客户。
  3. 如果交货已到达目的地,则发送交货事件。

我们有多个也实现了连接到主服务器的远程客户端。 如果连接可用,他们使用访问主数据库或者如果不使用他们自己的数据库。 为了处理数据的一致性,我们实现了2PC机制。 为此,我们使用JMS来交换这些系统之间的消息,即一个充当协调者,通过在队列上发送消息来启动进程,而另一些则通过在队列上再次发送消息来作出响应。 正如其他人已经提到,这是类似的酒吧/分模型。

我们已经使用消息生成在线报价

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

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