我基本上在芹菜中使用rabbitmq队列作为穷人的同步。例如,当某些对象被更新(并且成本很高)时,我会根据它们的对象ID将它们循环到一组10个队列。首先这是一种常见的模式还是有更好的方式。
其次,使用celeryd,似乎并发级别选项(CELERY_CONCURRENCY)设置所有队列中的工作者数量。这种方法无法使用队列进行同步,因为队列可以由多个工作人员提供服务,这意味着在对同一个对象执行不同操作时可能存在竞争条件。
有没有办法设置并发级别(或工作池选项),以便每N个队列有一个工作者?
由于 斯
答案 0 :(得分:2)
为什么不使用memcache或nosql db简单地实现全局任务锁定系统? 通过这种方式,您可以避免任何竞争条件。
这是一个例子 http://ask.github.com/celery/cookbook/tasks.html#ensuring-a-task-is-only-executed-one-at-a-time
答案 1 :(得分:0)
与您问题的第一部分相关,我在此处提出并回答了类似的问题:Route to worker depending on result in Celery?
基本上,您可以根据密钥直接路由到工作人员,在您的情况下,该密钥是ID。它避免了对单个锁定点的任何需要。希望它有用,即使这个问题是2岁:)