开发者社区 > 云原生 > 消息队列 > 正文

现在 RocketMQ 的消息删除策略是怎么样的?

现在 RocketMQ 的消息删除策略是怎么样的?如果被删除了的话,应该就拿不到了吧。
我有一个用户注册的公共事件,去年建的 Topic。现在新增了一个消费组,会拿到以前所有的消息吗?(我测试了一下是可以拿到的)

展开
收起
嘟嘟嘟嘟嘟嘟 2023-11-07 13:42:47 213 0
3 条回答
写回答
取消 提交回答
  • RocketMQ 的消息删除策略取决于它的配置以及使用场景。一般来说,RocketMQ 有两种类型的消息存储:普通消息存储和延迟消息存储。对于普通消息存储来说,消息会在发送之后的一定时间内自动被删除,而延迟消息则会在指定的时间点之后被删除。具体的删除时间和方式可以通过 RocketMQ 的配置文件进行调整。
    另外,当消息被删除之后,理论上应该是不能再被获取的。因为 RocketMQ 通常采用的是定期清理的方式删除消息,也就是说,在一段时间内如果没有消费者订阅这个话题或者消费这些消息,那么这些消息就会被删除。一旦消息被删除,就无法再被获取。
    不过,在实际应用中,如果只是暂时没有消费者订阅某个话题,但是后来又有了新的消费者订阅这个话题,那么这部分消息还是有可能被再次消费到的。这是因为 RocketMQ 在收到新的消息时,不会立即删除旧的消息,而是会在等待一段时间之后才会清理旧的消息。这段时间称为“过期时间”。因此,在这个期间如果有新的消费者订阅这个话题,那么这部分消息还是可以被消费到的。
    综上所述,如果你新建了一个消费组并且订阅了去年建立的那个公共事件的话题,那么理论上来说你是能够获取到去年发布的那些消息的。当然,这也取决于 RocketMQ 的配置和具体情况,不能一概而论。

    2023-11-07 22:33:29
    赞同 1 展开评论 打赏
  • RocketMQ 的消息删除策略基于时间范围的保留周期,默认情况下,RocketMQ 将保持消息三天。
    如果您启用了清理机制,则消息将在保留期限到期后自动删除,并且无法检索到已删除的消息。请注意,目前 RocketMQ 并没有直接删除消息的方法。
    至于新的消费组是否会收到旧的消息,取决于是否设置了Topic 设置中的 autoSubscribe 行为。
    在默认情况下,当您创建一个新的消费组,并加入旧 Topic 时,它会自动订阅所有现有队列中的消息。因此,即使是最老的消息也能被新的消费组收到。请注意,当消费者接收到消息并发送 ACK 之后,消息将从服务器移除并不可逆。

    2023-11-07 15:55:12
    赞同 展开评论 打赏
  • 面对过去,不要迷离;面对未来,不必彷徨;活在今天,你只要把自己完全展示给别人看。

    首先,根据我的知识库中的信息,RocketMQ 消息删除的策略主要有以下几种:

    1. 当磁盘存储空间达到强制清理阈值或预警线时,会对没有过期的消息文件进行删除。
    2. 对于过期的文件, RocketMQ 会自动进行清理。

    如果你在 RocketMQ 中定义了一个持久化的 Topic,并且启用了消息保留策略,那么即使消息被消费者消费后,RocketMQ 仍然会在 Broker 上保留一定时间的消息副本。这意味着即使消费者因为某种原因失败或者重新订阅,它仍然可以从 Broker 中获取到之前的消息。

    根据你的描述,你在一年前创建了一个用户注册的公共事件 Topic,但是直到最近才增加了一个新的消费组。在这种情况下,新的消费组确实有可能从 Broker 中获取到之前的所有消息。这是因为 RocketMQ 通常会将消息保留在 Broker 上一段时间,除非你显式地删除了它们。所以,即使消息已经被之前的消费者消费过了,新的消费组仍然可以在规定的时间内从中获取到消息。

    2023-11-07 14:01:25
    赞同 展开评论 打赏

多个子产品线联合打造金融级高可用消息服务以及对物联网的原生支持,覆盖多行业。

相关产品

  • 云消息队列 MQ
  • 热门讨论

    热门文章

    相关电子书

    更多
    RocketMQ Client-GO 介绍 立即下载
    RocketMQ Prometheus Exporter 打造定制化 DevOps 平台 立即下载
    基于 RocketMQ Prometheus Exporter 打造定制化 DevOps 平台 立即下载