【问题标题】:Message persistence in TopicTopic中的消息持久化
【发布时间】:2017-09-14 19:22:22
【问题描述】:

我曾怀疑消息是否会保留在主题中,我的大部分答案来自this post

但是这种情况怎么样 - 假设代理已经开始,并且一些发布者已经开始向一个主题发送消息,现在将来一些持久订阅者将与这个主题建立连接,但目前没有持久订阅者,所以在代理的情况下重新启动发布者发送到该主题的所有消息,直到现在都会丢失?

我尝试了上述情况,确实所有消息都丢失了。此外,我尝试了这种情况 - 我有一个活跃的持久订阅者,它能够将消息推送到主题,然后它停止运行,同时更多消息被推送到主题,然后代理重新启动,最后所有这些增量消息迷路了。

所以,这基本上意味着如果 TOPIC 消息无法持久化,因为与我之前提到的那篇帖子中的答案相反,拥有持久订阅者没有效果,因为如果有活跃的持久订阅者,那么消息将立即被它消耗,如果没有活动的持久订阅者并且代理重新启动,那么消息就会丢失。

那么,底线是,如果 TOPIC 消息无法持久化,或者我的理解/测试有误?

【问题讨论】:

    标签: jms activemq


    【解决方案1】:

    这里需要澄清一点。

    1) 没有订阅者的代理 - 所有消息都被代理丢弃。

    2) 具有在线持久订阅者的代理 - 消息(持久性和非持久性)被传递到订阅者的存储,通常是一个队列,然后由订阅者使用。

    3) 具有离线持久订阅者的代理 - 消息(持久性和非持久性)被传递到订阅者的存储。如果代理出现故障,所有非持久性消息都会丢失。但是,当代理重新启动时,所有持久消息都会恢复。

    4) 具有在线非持久订阅者的代理 - 消息(持久和非持久)被传递给消费者。如果订阅者下线,则不会向消费者传递任何消息,并且代理不会缓存任何消息。

    IBM MQ 提供了一个名为 Retain Publication 的选项,用于保留发布在主题上的最新消息的副本。这样,任何迟到的加入者都会收到这条最新消息。

    【讨论】:

      【解决方案2】:

      对于一个干净的代理开始,在相关主题上没有离线持久订阅,代理不会持久保存消息,即使它们是使用 Persistent 的传递模式发送的。如果您随后添加作为持久发送的持久订阅消息将被写入存储,并且如果持久订阅处于脱机状态,则它们将被保留直到被使用,或者如果有持久订阅消费者正在读取和确认它们,则将其删除。

      如果您不使用 Persistent 的传递模式发送消息,那么即使存在现有的持久订阅,它们也将永远不会被持久化。并且一旦持久订阅被取消订阅,即使它们被标记为持久,代理也会返回不存储主题消息。

      鉴于您看到的最佳猜测是您在发送时的交付模式是非持久的。

      【讨论】:

        猜你喜欢
        • 2015-12-19
        • 1970-01-01
        • 1970-01-01
        • 2012-09-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-30
        • 2012-12-26
        相关资源
        最近更新 更多