【问题标题】:JMS Topic vs QueuesJMS 主题与队列
【发布时间】:2011-07-31 09:22:04
【问题描述】:

我想知道 JMS 队列和 JMS 主题之间有什么区别。

ActiveMQ page

主题

在 JMS 中,Topic 实现了发布和订阅语义。当您发布消息时,它会发送给所有订阅者 有兴趣 - 所以零到很多订阅者都会收到一份 信息。只有当时有有效订阅的订阅者 代理收到消息会得到消息的副本。

队列

JMS 队列实现 负载平衡器 语义。只有一个消费者会收到一条消息。如果没有 发送消息时可用的消费者,它将被保留 直到可以处理消息的消费者可用。如果一个 消费者收到一条消息并且在关闭之前没有确认它 然后消息将被重新传递给另一个消费者。一个队列可以 有许多消费者在可用消息中负载平衡 消费者。

我想拥有一个“东西”,它将按照与 ActiveMQ 代理接收消息的顺序相同的顺序向每个订阅者发送消息的副本。

有什么想法吗?

【问题讨论】:

    标签: jms activemq


    【解决方案1】:

    这意味着一个主题是合适的。队列意味着消息发送给一个且只有一个可能的订阅者。每个订阅者都有一个主题。

    【讨论】:

    • 知道负载平衡是如何为 JMS 或 WSO2 MB 中的队列工作的吗?
    • 这很有趣,因为我正在尝试调试一些订阅者,并且在发送主题时未调用订阅者,但是在发送到队列时它起作用了
    • 更准确地说,例如使用 RabbitMQ,您可以使用扇出交换机制,将相同的消息发送到所有分配的队列,因此许多消费者会收到它。不完全是 pub-sub,但可以做类似的事情。
    【解决方案2】:

    订单保存见this ActiveMQ page。简而言之:为单个消费者保留订单,但不保证多个消费者的交付顺序。

    【讨论】:

      【解决方案3】:

      主题适用于发布者-订阅者模型,而队列适用于点对点。

      【讨论】:

        【解决方案4】:

        Queue 是 JMS 托管对象,用于保存等待订阅者消费的消息。当所有订阅者都消费完消息后,消息将从队列中移除。

        主题是一个主题的所有订阅者在消息发布时都会收到相同的消息。

        【讨论】:

        • 队列消息只会被单个消费者消费一次,这就是队列实现负载均衡器的原因。主题订阅可以是durable:订阅者可以在发布后很久才收到消息(例如,如果订阅者被关闭并再次出现)。
        【解决方案5】:

        如果你有 N 个消费者,那么:

        JMS 主题将消息传递给 N of N JMS 队列将消息传递到 N 个中的 1 个

        您说您“正在寻找一种‘东西’,它会按照与 ActiveMQ 代理接收消息的顺序相同的顺序向每个订阅者发送消息副本。”

        所以你想使用一个主题,以便所有 N 个订阅者都获得消息的副本。

        【讨论】:

          【解决方案6】:

          JMS 主题 是一对多分发模型中的目的地类型。 所有消费订阅者都会收到相同的发布消息。您也可以将其称为“广播”模型。对于分布式计算,您可以将主题视为Observer design pattern 中的主题。一些 JMS 提供者有效地选择将其实现为 UDP 而不是 TCP。对于主题,消息传递是“即发即弃”——如果没有人听,消息就会消失。如果这不是您想要的,您可以使用“持久订阅”。

          JMS 队列 是一对一的消息目的地。该消息仅由消费receivers 之一接收(请注意:始终将subscribers 用于'topic client's,将receivers 用于queue client's,以避免混淆)。发送到队列的消息将存储在磁盘或内存中,直到有人捡起它或它过期。所以队列(和持久订阅)需要一些主动的存储管理,你需要考虑慢消费者。

          我认为,在大多数环境中,主题 是更好的选择,因为您始终可以添加其他组件而无需更改架构。添加的组件可能是监控、日志记录、分析等。 在项目开始的时候,你永远不知道 1 年、5 年、10 年的需求会是什么样子。改变是不可避免的,拥抱它:-)

          【讨论】:

            【解决方案7】:

            TOPIC:: 主题是一对多的通信...(多点或发布/订阅) EX:-想象一个出版商在 youtube 上发布电影,然后它的所有订阅者都会收到通知.... QUEVE::queve 是一对一的交流... 例如:-当发布充值请求时,它只会发送给一个 qreciever ... 永远记住,如果请求转到所有 qreceivers 则发生多次充值,因此在开发适合应用程序的分析时

            【讨论】:

              【解决方案8】:

              队列

              优点

              • 具有透明通信流程的简单消息传递模式
              • 可以通过将消息放回队列来恢复消息

              缺点

              • 只有一位消费者可以收到消息
              • 暗示生产者和消费者之间的耦合,因为它是一对一的关系

              主题

              优点

              • 多个消费者可以收到一条消息
              • 生产者和消费者之间的解耦(发布和订阅模式)

              缺点

              • 更复杂的通信流程
              • 无法为单个侦听器恢复消息

              【讨论】:

                【解决方案9】:

                就这么简单:

                队列 = 插入 > 退出(发送给单个订阅者)1:1

                主题 = 插入 > 广播(发送给所有订阅者)1:n

                【讨论】:

                • 一个简单的社交网络示例。有人“喜欢”一个帖子。后端向主题发布“POST LIKE”事件。它被 3 个订阅者消费:notificationProcessor(向发布者发送通知)、karmaProcessor(给喜欢者和发布者提供业力)、feedProcessor(向上移动到人们的提要中)。当然都是异步的。
                • @Siddhartha,这可能是一个包含在示例中的答案,谢谢!
                猜你喜欢
                • 2018-03-30
                • 2013-06-30
                • 2012-12-15
                • 1970-01-01
                • 2012-02-22
                • 2012-11-14
                • 2013-01-27
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多