具有唯一密钥的RabbitMQ工作者

时间:2018-07-08 12:37:29

标签: rabbitmq

我正在考虑将RabbitMQ用于新项目(几乎没有RabbitMQ经验)来解决以下问题:

一旦发生事件,必须执行长时间运行的计算。 https://www.rabbitmq.com/tutorials/tutorial-two-python.html中描述的“工作队列”模式似乎是完美的,但我想再加一点:我不希望两个作业具有相同的路由密钥(或有效负载或元数据的某些部分,但是要实现这一点)同时在工人上运行。换句话说:当一个工人正在处理作业XY,而另一个作业XY排队时,消息XY不得传递给新的空闲工人,直到正在运行的工人完成该作业为止。

实施该策略的最佳策略是什么?我想出的唯一真正的解决方案是,当一个工人得到一份工作时,它必须与所有其他工人一起检查他们是否正在处理类似的工作,如果是,则拒绝该消息(用于重新排队)。

1 个答案:

答案 0 :(得分:1)

根据您的体系结构,有两种解决问题的方法。

  1. 使用者共享正在处理的任务的缓存,并且如果显示相同类型的作业,则他们reject或将其重新排队。

    这需要维护共享缓存,并且在使用者方面需要一些逻辑。

    副作用是重复的作业将在拒绝的情况下继续返回给使用者,而在重新排队的情况下,它们将以不可预测的延迟(取决于队列的大小)进行处理。

  2. 您在队列上使用deduplication plugin

    您将不需要任何额外的缓存,发布者端只需几行代码。

    此方法的缺点是重复的消息将被丢弃。如果您希望将其交付,则需要指示发布者在negative acknowledgment on the publisher的情况下重试。