我有一个用于生成文档的 RabbitMQ 队列。基本上每个文档都有type
and state
(新的、处理中的、准备就绪),所以我使用带有路由键的主题交换,例如type.state
。每次文档更改时,我都会将带有最新文档描述的消息发送到交易所,并且效果足够好。
然而有时文档可以被处理两次:
- 用户发送新文档。那么新消息
report.new
被发送去交换。
- 当工作人员尚未开始文档处理(队列尚未到达)时,用户更新了文档。新消息
report.new
发送相同的文档。
- 现在工人收到第一条消息并开始工作,而文档已更改,因此这项工作完全没有意义。
现在我只是向工人添加小代码,比较last_modified
将消息中的密钥与数据库中的密钥进行记录,如果不相同,则确认消息。但我不认为这是最好的解决方案。
我的想法是添加ID
消息头并有一些 RabbitMQ 插件,它将删除具有相同内容的旧消息ID
从队列中。
Thanks.
附:也许另一个 MQ 引擎在这里有用?例如。也许ActiveMQ有这样的功能?
好吧,我读过 RabbitMQ 内部架构并发现这是不可能的。对于寻找它的人来说,这是一种方法。
- 仅发送文档
ID
在消息正文中
- 为工作人员创建一个键值存储(我为此使用 memcached)。关键是
ID
值是为此运行的最后一个工作程序的时间戳ID
.
- 当工作进程收到消息时,它会检查消息时间戳是否大于键值存储中的时间戳。如果是,则更新存储中的时间戳并运行任务,否则跳过它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)