如果没有队列侦听该密钥,如何向DirectExchange发送消息自动删除

时间:2016-06-02 22:24:24

标签: ruby rabbitmq

我有这样的场景,我不确定Bunny是否可以支持: 我有一个定期生成消息的Producer。而且有3个消费者。因为我想模仿RPC,所以不是使用Fanout Exchange,而是我的生产者的每一轮都向DirectExchange发送三条消息,并带有相应的路由密钥。消费者将获得消息并回复临时回复队列。 所以问题是,我的消费者并不总是在线(我正在实施RAFT一致性算法)。但是,当它在网上发布之前"陈旧"生产者发送的消息刚刚通过,我的刚刚在线的消费者开始处理这么多已经无效的RPC消息,这破坏了我的应用程序逻辑。 有没有办法可以向DirectExchange发送消息,如果没有队列正在侦听路由密钥,那么消息会被丢弃?我正在考虑在发送之前制作一个时间戳并在收到时检查时间戳,但这显然不是一个好的解决方案,因为"陈旧的阈值"很难解决。 十分感谢大家!任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

您可以使用message TTL。也许将TTL设置为0是你想要的。

  

将TTL设置为0会导致消息在到达时过期   排队,除非他们可以立即交付给消费者。

请注意,每个队列和每条消息都可以设置。我还要引用链接中的警告:

  

虽然消费者永远不会看到过期的消息,但只有过期的消息才会出现   到达队列的头部他们实际上会被丢弃(或   死字母)。设置每队列TTL时这不是问题,   因为过期的消息总是在队列的头部。什么时候   但是,设置每条消息的TTL,过期的消息可以排在后面   非过期的,直到后者被消费或过期。于是   此类过期消息使用的资源将不会被释放,它们也将被释放   将计入队列统计信息(例如,中的消息数)   队列)。