Rabbitmq :: 消息永远不会从流队列中删除

问题描述 投票:0回答:3

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

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

stream rabbitmq spring-rabbit
3个回答
2
投票

我找到的解决方案:

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

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

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


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 Google 群组询问;他们没有如此密切地监控。


0
投票

同样的问题,消息根本就被删除了。

© www.soinside.com 2019 - 2024. All rights reserved.