【问题标题】:Rabbitmq :: Message is never removed from stream queueRabbitmq :: 消息永远不会从流队列中删除
【发布时间】:2022-06-10 22:22:46
【问题描述】:

我在项目的 rabbitmq 中创建了一个stream 队列,并将 max-age 配置为 1 分钟。我向队列发送了一条消息,所有消费者都消费了该消息,但该消息仍在队列中(我等了超过 1 分钟)为“就绪”。我担心的是rabbitmq实例HD中的消息堆积。

所以,我的问题是:所有标记为“就绪”的消息都存储在 HD 中,即使在所有消费者都消费了这些消息之后?如果是,我怎样才能从 rabbitmq 实例的 HD 中清除这些消息(在这种情况下,max-age 不起作用)?

【问题讨论】:

  • 同样的问题,你找到解决办法了吗?
  • @MichelAndrade,我发表了答案

标签: rabbitmq spring-rabbit


【解决方案1】:

这就是设计;见https://www.rabbitmq.com/streams.html#retention

流被实现为不可变的仅附加磁盘日志。这意味着日志将无限增长,直到磁盘用完为止。为避免这种不良情况,可以为每个流设置保留配置,该配置将根据总日志数据大小和/或年龄丢弃日志中最旧的数据。

有两个参数可以控制流的保留。这些可以组合。这些要么在声明时使用队列参数设置,要么作为可以动态更新的策略。 ...

max-age:

valid units: Y, M, D, h, m, s

e.g. 7D for a week

max-length-bytes:

the max total size in bytes

注意:留存率是基于每个段评估的,因此还有一个参数生效,即流的段大小。只要片段包含至少一条消息,流将始终保留至少一个片段。使用代理提供的偏移量跟踪时,每个消费者的偏移量都作为非消息数据保存在流本身中。

但我明白你的意思。

我建议你在 RabbitMQ 工程师常去的 rabbitmq-users 谷歌群里问问;他们没有密切监视。

【讨论】:

    【解决方案2】:

    同样的问题,邮件被删除了。

    【讨论】:

      【解决方案3】:

      我找到的解决方案:

      • 无法避免将数据存储到 HD 或进行清除,但可以防止过度使用磁盘。

      • 将参数 x-stream-max-segment-size-bytes 添加到队列中,将默认大小减小到适合您需要的大小。例如,我定义了 1 mb。更多详情:https://www.rabbitmq.com/streams.html#declaring

      • 至少有一个段文件会一直保留,所以如果您只发送 1 条消息并等待,它将永远保留在磁盘上。但是,如果您继续发布,则会在某个时间点创建一个新的分段文件并启动保留过程。仅包含超过保留期的消息的文件将被删除。

      【讨论】:

        猜你喜欢
        • 2015-12-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-09
        • 2018-04-09
        • 2015-07-24
        • 1970-01-01
        相关资源
        最近更新 更多