RabbitMQ:防止作业同时在两个不同的工作者上运行

时间:2013-11-20 12:02:07

标签: python django rabbitmq pika

我有两个RabbitMQ工作者的Python Django项目,使用pika lib,它接收作业以对请求中指定的某个Django对象执行操作。

问题是,我不希望工作者A和B在同一个Django对象x上执行他们的操作,同时可能会导致问题。无论哪个工作人员先行,但如果A正在处理x而B接到一个工作来处理x,我希望这个工作等到A完成。

所以问题归结为能够知道其他工作人员正在做什么并且能够暂停工作直到某个时间。请注意,在我的实际项目中,我必须应用两个以上的工作者,我选择两个在我的示例中,以便更容易剖析。

感谢您的帮助, 的Mattias

1 个答案:

答案 0 :(得分:1)

您必须使用一些锁定机制,可能基于数据库。

  1. 当一个worker正在处理一个django对象时,它标记了数据库中的工作。 MySQL示例:

    worker_id | object_id | task_type   22 44 3 //插入条目以标记作品

  2. 当另一个工作人员拿起一个django对象时,会检查它是否在#1中没有标记,然后继续选择下一个项目。

  3. 当一个worker完成一个对象的工作时,数据库锁定行将被删除或标记为FINISHED。