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

91zkwejq  于 2022-11-08  发布在  RabbitMQ
关注(0)|答案(3)|浏览(257)

我已经在我的项目的rabbitmq中创建了一个stream队列,并将max-age配置为1分钟。我向队列发送了一条消息,所有的使用者都使用了该消息,但该消息仍保留在队列中(我等待了超过1分钟),显示为“就绪”。我担心的是rabbitmq示例的HD中消息的累积。
所以,我的问题是:所有标记为“就绪”的消息都存储在HD中,即使所有消费者都使用了这些消息?如果是,我如何才能从rabbitmq示例的HD中清除这些消息(在这种情况下,最大年龄不起作用)?

yquaqz18

yquaqz181#

那就是设计;请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

注意:保留是以每个区段为基础来评估的,因此多了一个生效的参数,也就是数据流的区段大小。只要区段至少包含一个消息,数据流就会永远保留至少一个区段。使用Broker提供的位移追踪时,每个使用者的位移都会以非消息数据的形式保存在数据流本身中。
但我明白你的意思。
我建议您在RabbitMQ用户的Google组上询问RabbitMQ工程师们在哪里闲逛;他们监控得不那么严密。

brvekthn

brvekthn2#

同样的问题在这里,消息是nerver删除。

wqnecbli

wqnecbli3#

我找到的解决方案是:

  • 无法避免将数据存储到硬盘或进行清除,但可以防止过度使用磁盘。
  • 将参数x-stream-max-segment-size-bytes添加到队列中,将默认大小减小到您需要的大小。例如,我定义了1 mb。更多细节:https://www.rabbitmq.com/streams.html#declaring
  • 至少会始终保留一个分段文件,因此如果您只发送1封邮件并等待,它将永远保留在磁盘上。但是,如果您继续发布,则会在某个时间点创建一个新的分段文件,并开始执行保留过程。仅包含早于保留期的邮件的文件将被删除。

相关问题