RabbitMQ的插件删除重复的邮件

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

我有一个文件产生的RabbitMQ队列。基本上,每个文件都有typestate(新,处理,准备),所以我用像type.state路由键话题的交流。每当文档更改我发送消息与去年文档描述的交流和它的作品不够好。

然而有时文档可以被处理两次:

  1. 用户发送新的文档。因此,新的消息report.new发送到交换。
  2. 虽然工人还没有开始文档处理(队列中还没有达到)用户更新文档。对同一文档的新信息report.new发送。
  3. 所以,现在的工人得到的第一个消息,并开始他的工作,而该文件被改变,因此这项工作是毫无道理的。

现在我只是添加少量的代码到工人,从比较与数据库中的一个消息last_modified文档关键,如果他们是不一样的ACK消息。但是我不认为这是最好的解决办法。

我的想法是ID添加到邮件头,并且有一定的RabbitMQ插件,它将会从队列中相同ID删除旧邮件。

谢谢。

附:也许另一个MQ引擎是有用的吗?例如。也许ActiveMQ的有这样的功能?

rabbitmq message-queue
3个回答
6
投票

好吧,我读过有关RabbitMQ的内部结构,并发现它是不可能的。所以周围人的方式寻找它。

  1. 仅发送文件ID在邮件正文
  2. 创建一个工人key-value存储(我使用memcached的这个)。关键是ID值为此ID最后一名工人跑时间戳。
  3. 当工人接收到消息则检查消息时戳大于从键值存储的一个。如果是,那么在店里更新时间戳和运行任务,否则就跳过它。

3
投票

您可以检查此plugin我写它允许删除重复的代理中发布的消息。

您可以根据自己的需要在交易所或在队列中删除重复。只有你的发布商需要做的事情就是设置x-deduplicate-message邮件头与邮件的ID


1
投票

正如你写,ActiveMQ has "duplicate message detection",但它的工作方式不同。它不会从队列中删除旧邮件,但它并没有将它添加新的消息来代替。所以,它的工作原理一样plugin for RabbitMQ

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