【问题标题】:Virtual topics/queues and durability虚拟主题/队列和持久性
【发布时间】:2014-01-14 21:36:24
【问题描述】:

当没有消费者收听时,发布到虚拟主题的消息会发生什么?经纪人会在订阅者可用之前持有它们一段时间吗?

更具体地说: 在 T0 和 T1 发布消息 M0 和 M1。在 T2,消费者 C1 连接,他会收到 M0 和 M1 吗?显然,在 T3 和 T4 发布的消息 M2 和 M3 将被 C1 接收,但是在 T5 接收连接的新消费者 C2 将接收什么?所有消息,M2 和 M3,还是没有?

【问题讨论】:

  • 我得问一下,到目前为止你尝试过什么?
  • 还没来得及尝试,会的。目前对我来说只是理论上的事情,但我需要知道

标签: activemq


【解决方案1】:

这取决于主题的性质: 如果主题是持久的(有持久的消费者订阅它),代理将把消息保存在主题中,直到所有的持久消费者都消费完这些消息。 如果主题是非持久的(没有持久消费者),则消息甚至不会发送到主题,因为不会有持久订阅。

对于您的示例,我认为您正在使用持久订阅/消费者: 案例一:

  • T-2 C1 和 C2 对主题进行持久订阅
  • T-1 C1 和 C2 断开
  • T0:M0 已过帐
  • T1:M1 发布
  • T2:C1 连接。 C1接收M0和M1
  • T3:已发布 M3。 C1收到M3
  • T4:已发布 M4。 C1收到M4
  • T5:C2连接,C2接收M0、M1、M2、M3、M4

那是因为他们持有durable subscriptions 使用持久主题/队列时需要非常小心:如果消费者不取消订阅,代理将保留消息,直到消息存储爆炸。您需要确保它不会发生(通过设置eviction policies 和/或在消息上设置生存时间)。 当然,前面的示例会根据消费者何时进行持久订阅而有所不同。

如果您使用的是非持久主题:

  • T-2 C1 和 C2 正常订阅主题
  • T-1 C1 和 C2 断开
  • T0:M0 已过帐
  • T1:M1 发布
  • T2:C1 连接。 C1 没有收到任何东西
  • T3:已发布 M3。 C1 收到 M3
  • T4:已发布 M4。 C1 收到 M4
  • T5:C2 连接,C2 没有收到任何东西

【讨论】:

    【解决方案2】:

    有两种方法可以让发布到虚拟主题的消息成功。第一个是通过持久订阅者,另一个是发布者以“PERSISTENT”的传递模式发送消息。当消息以“PERSISTENT”的传递方式发布时,消息将保存在磁盘上,否则将保存在内存中。

    【讨论】:

      【解决方案3】:

      为什么不能有观察者/可观察模式——以上面的例子为例:

      M0发布时,C1和C2(消费者订阅)被唤醒,可以消费事件吗?我认为这种模式比耐用和非耐用 - 一种混合方法更好。

      【讨论】:

        猜你喜欢
        • 2012-01-23
        • 2020-03-08
        • 1970-01-01
        • 1970-01-01
        • 2012-03-08
        • 2011-10-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多