RabbitMQ插件删除重复的邮件

时间:2017-08-07 03:45:22

标签: rabbitmq message-queue

我有一个RabbitMQ队列用于生成文档。基本上,每个文档都有typestate(新的,处理的,准备好的),所以我使用主题交换和type.state之类的路由键。每次文档更改时,我都会将包含上一个文档描述的消息发送到交易所,并且它的工作情况非常好。

但有时文件可以处理两次:

  1. 用户发送新文件。因此,新邮件report.new将被发送到交换。
  2. 当工作人员尚未开始文档处理(队列尚未到达)时,用户更新了文档。发送同一文档的新消息report.new
  3. 所以现在工作人员得到第一条消息并开始他的工作,而文档被更改,所以这项工作完全没有意义。
  4. 现在我只需要向工作人员添加小代码,将消息中的last_modified文档密钥与数据库中的文档密钥进行比较,如果消息不相同,则将消息添加到消息中。但是我不认为这是最好的解决方案。

    我的想法是将ID添加到邮件标头并添加一些RabbitMQ插件,该插件将从队列中删除具有相同ID的旧邮件。

    感谢。

    P.S。也许另一个MQ引擎在这里有用吗?例如。也许ActiveMQ有这样的功能?

3 个答案:

答案 0 :(得分:5)

好的,我读过有关RabbitMQ内部架构的内容并发现它是不可能的。所以找人的方式就好了。

  1. 仅在邮件正文中发送文档ID
  2. 为worker创建一个键值存储(我为此使用memcached)。密钥是ID值是此ID的最后一个工作人员的时间戳。
  3. 当工作人员收到消息时,它会检查消息时间戳是否大于键值存储中的消息时间戳。如果是,则更新商店中的时间戳并运行任务,否则只需跳过它。

答案 1 :(得分:2)

您可以查看我写的plugin,它允许对代理中发布的消息进行重复删除。

您可以根据需要在交易所或队列中删除重复数据。您的发布商唯一需要做的就是使用您的邮件的x-deduplicate-message设置ID邮件标题。

答案 2 :(得分:1)

如您所写,ActiveMQ has "duplicate message detection",但其工作方式有所不同。它不会从队列中删除旧消息,但不会向其中添加新消息。因此它的作用与plugin for RabbitMQ相同。