RabbitMQ插件删除重复的消息

Xim*_*mik 6 message-queue rabbitmq

我有一个RabbitMQ队列用于生成文档.基本上,每个文件都有typestate(新,处理,准备),所以我用像路由键的话题交换type.state.每次文档更改时,我都会将带有上一个文档描述的消息发送到交换机,并且它的工作状态非常好

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

  1. 用户发送新文件.所以新消息report.new被发送到交换.
  2. 虽然worker尚未启动文档处理(队列尚未到达),但用户更新了文档.report.new发送同一文档的新消息.
  3. 因此,现在工作人员得到第一条消息并开始他的工作,而文档被更改,因此这项工作完全没有意义.

现在我只是将小代码添加到工作程序中,将last_modified消息中的文档密钥与数据库中的密钥进行比较,如果它们不相同则查询消息.但是我不认为这是最好的解决方案.

我的想法是添加ID到消息头并有一些RabbitMQ插件,它将ID从队列中删除相同的旧消息.

谢谢.

PS也许另一个MQ引擎在这里有用吗?例如,ActiveMQ可能有这样的功能吗?

Xim*_*mik 8

好的,我读过RabbitMQ内部架构,发现它是不可能的.所以有人寻找它的方式.

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

  • Memcache 对此不太适用,因为它可能会在没有警告的情况下删除您的键/值。 (2认同)

nox*_*fox 5

您可以检查我编写的此插件,该插件可以删除代理中发布的消息的重复数据。

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