【问题标题】:Conditional deletion of messages from RabbitMQ从 RabbitMQ 有条件地删除消息
【发布时间】:2016-07-01 02:48:41
【问题描述】:

我有几个队列,其中包含某些信息。假设我有“成功”和“失败”队列,其中服务器端组件不断将一些数据写入这些队列以供客户端使用。

客户端读取此数据并将其显示在最终用户的 UI 上。现在,我需要清除这些队列中超过 30 天的任何消息。这样,客户在任何时间点都只能看到 30 天的信息。

我进行了很多搜索,可以看到一些命令行选项来清除整个队列,但找不到相关建议。

对正确方向的任何帮助表示赞赏。谢谢

【问题讨论】:

    标签: c# rabbitmq


    【解决方案1】:

    我认为这是不可能的;看起来您正在尝试使用 RabbitMq 作为数据存储而不是消息服务器。

    了解消息是否“早于” 30 的唯一方法是处理该消息,通过这样做,您将从队列中删除该消息。 最好的办法是处理消息并将它们存储在长期存储中;那么您可以实施删除策略来消除旧元素。

    如果你真的想走这条路,RabbitMQ 在队列级别或消息级别实现 TTL;看看这个:https://www.rabbitmq.com/ttl.html

    [如 cmets 中所述]

    要将消息保留在队列中,您可以尝试使用 NACK 而不是 ACK 作为确认;这样,RabbitMQ 将认为消息未传递,它会一次又一次地尝试传递它。记得创建一个持久队列 (https://www.rabbitmq.com/confirms.html)。

    您也可以查看这个答案:Rabbitmq Ack or Nack, leaving messages on the queue

    【讨论】:

    • 客户端 UI 应该随时读取这些队列中的消息。从队列中读取消息时,是否有标志或选项可以将消息保留在队列中?我只想删除超过过期策略但应可用于来自客户端的多次读取请求的消息
    • Luca 是对的 - 您正在寻找数据存储,例如数据库,而不是 RabbitMQ。当一条消息发布时,它应该被消费一次,然后你可以在其他系统中做任何你需要的事情,比如将它存储在一个数据库中,这样它就可以被多次访问。
    • @techspider 我刚刚在我的回答中添加了一个关于 ack 和 nack 的简短部分,也许它会对你有用。
    • 谢谢@LucaGhersi;我理解你的逻辑来解决我的问题,虽然它不是传统的。
    猜你喜欢
    • 2013-09-05
    • 2011-03-26
    • 1970-01-01
    • 2015-12-20
    • 2015-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-14
    相关资源
    最近更新 更多