【问题标题】:RabbitMQ: Preventing jobs to run simultaneously on two different workersRabbitMQ:防止作业同时在两个不同的工作人员上运行
【发布时间】:2013-11-20 12:02:07
【问题描述】:

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

问题是,我不希望工作人员 A 和 B 同时对同一个 Django 对象 x 执行操作,因为这可能会导致问题。哪个工人先去并不重要,但如果 A 正在处理 x 并且 B 收到一份工作来处理 x,我希望这项工作等到 A 完成。

所以问题归结为能够知道其他工人在做什么,并且能够暂停工作直到特定时间。请注意,在我的实际项目中,我有超过 2 名工人,这必须适用于,我选择两个在我的示例中以便更容易剖析。

感谢您的帮助, 马蒂亚斯

【问题讨论】:

  • 这听起来像是资源限制的作业调度问题 - 不确定 RabbitMQ 是否是该作业的最佳工具。例如,如果作业 A 运行 5 分钟锁定对象 X,并且在作业 A 期间有 5,000 个作业 B 到达,那么您的程序可能会崩溃。你能对你的工作期限给出一个大概的估计吗?

标签: python django rabbitmq pika


【解决方案1】:

您将不得不使用一些锁定机制,可能基于数据库。

  1. 当工作人员处理 django 对象时,它会在数据库中标记该工作。 MySQL 示例:

    worker_id | object_id |任务类型 22 44 3 // 插入条目以标记作品

  2. 当另一个工人捡起一个 django 对象时,它会检查它是否没有被标记为 #1,然后继续挑选下一个项目。

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

【讨论】:

  • 虽然我第二次采用这种方法,但在错误/超时/工作线程死亡等异常工作终止后,锁释放存在一些问题
  • 好的,这可能行得通,但我如何继续选择下一个项目,这是我不确定的逻辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-14
  • 2011-09-10
相关资源
最近更新 更多