【问题标题】:Real world use of JMS/message queues? [closed]JMS/消息队列的真实使用? [关闭]
【发布时间】:2010-11-05 09:02:28
【问题描述】:

我刚刚阅读了有关 JMS 和 Apache ActiveMQ 的信息。 并且想知道这里的人们将 JMS 或类似的消息队列技术用于什么实际用途?

【问题讨论】:

    标签: java jms message-queue


    【解决方案1】:

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

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

    • 在后端调试日志记录。所有应用服务器都在各个级别广播调试消息。然后可以启动 JMS 客户端来监视调试消息。当然我可以使用syslog 之类的东西,但这给了我各种各样的方法来根据上下文信息过滤输出(如应用服务器名称、api 调用、日志级别、用户 ID、消息类型等... )。我还对输出进行了着色。

    • 调试日志记录到文件。与上面相同,仅使用过滤器提取特定部分,并记录到文件以进行常规记录。

    • 警报。同样,与上述日志记录类似的设置,监视特定错误,并通过各种方式(电子邮件、短信、即时消息、咆哮弹出窗口...)提醒人们

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

    • 还有通常的 - 延迟活动的排队交易,例如计费、订单处理、供应、电子邮件生成......

    在您想要保证异步传递消息的任何地方都很棒。

    【讨论】:

    • 在我看来,使用 JMS 进行调试日志记录并不合适。队列和消息传递的成本很高,并且日志记录(用于通常记录大量日志的调试)必须尽可能快。
    【解决方案2】:

    我已将它用于我的学术项目,该项目是类似于亚马逊的在线零售网站。 JMS 用于处理以下功能:

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

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

    【讨论】:

      【解决方案3】:

      我们正在使用 JMS 通过不可靠的网络与大量远程站点中的系统进行通信。松耦合与可靠消息传递相结合产生了稳定的系统格局:每条消息都会在技术上可行的情况下尽快发送,网络中更大的问题不会影响整个系统格局......

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          我用它在不同的基金管理系统之间发送日内交易。如果你想更多地了解什么是伟大的技术消息传递,我可以彻底推荐这本书“Enterprise Integration Patterns”。有一些 JMS 示例用于请求/回复和发布/订阅等。

          消息传递是一种出色的集成工具。

          【讨论】:

            【解决方案6】:

            我已经看到 JMS 用于不同的商业和学术项目。每当您想拥有一个完全解耦的分布式系统时,JMS 都可以轻松进入您的视野。一般来说,当您需要从一个节点发送您的请求时,您网络中的某个人会在没有/不向发送方提供有关接收方的任何信息的情况下处理它。

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

            【讨论】:

              【解决方案7】:

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

              例如,假设您有一个昂贵且非常重要的逻辑,如“买东西”,买东西的一个重要部分就是“通知东西商店”。我们使通知调用异步,以便通知调用中涉及的任何逻辑/处理都不会阻塞或与购买业务逻辑竞争资源。最终结果,购买完成,用户满意,我们得到了我们的钱,并且因为队列可以保证交付,商店一旦打开或队列中有新商品就会收到通知。

              【讨论】:

              • 请帮忙。 stackoverflow.com/questions/19706788/… 。感谢您的帮助和时间。
              • 但是由于请求是异步的,由于网络问题,您的消息可能无法发送。那这个呢?当您想购买东西时,必须发送您的通知。不是吗?
              【解决方案8】:

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

              【讨论】:

                【解决方案9】:

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

                【讨论】:

                【解决方案10】:

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

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

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

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

                【讨论】:

                • 嗨@jon 你看到这个文档标签了吗? stackoverflow.com/documentation/jms/commit 他们只需要一个提交者支持来启用该主题,我认为您可能是那个 :) 使他们能够在 JMS 上为我们提供很棒的文档
                • @Jon 据我所知 jms 本身就是企业集成模式的实现?
                • 不,骡子或骆驼会...
                • 如果任意数量的应用程序可能正在使用队列中的消息,队列如何知道何时删除旧消息?
                【解决方案11】:

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

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

                【讨论】:

                • 阅读您的回答后,我将把 JMS 添加到我的队列“我今年要学什么”:)
                • 在我们的日子里,我们可以使用异步方法调用,而不是使用 JMS 规范。欲了解更多信息,请参阅:docs.oracle.com/javaee/6/tutorial/doc/gkkqg.html
                • 它们并不完全相同。异步方法调用无法保证交付;没有主题可以同时发送给多个听众的概念。
                猜你喜欢
                • 2011-10-01
                • 2013-09-23
                • 1970-01-01
                • 2012-01-03
                • 2012-01-19
                • 1970-01-01
                • 1970-01-01
                • 2013-02-26
                • 2020-04-05
                相关资源
                最近更新 更多