如何布局队列/工作线结构以支持多个环境的大型任务?

时间:2010-05-06 14:33:27

标签: python django celery

对于基于Python / Django / Celery的部署工具,我们进行了以下设置:

  1. 我们目前使用默认的Celery设置。 (一个队列+交换称为“芹菜”。)
  2. 队列中的每个任务代表一个部署操作。
  3. 环境的每个任务都以可能需要(非常)长的同步阶段结束。
  4. 需要满足以下规范:

    1. 并发:多个环境的任务应同时执行。
    2. 锁定:每个环境可能同时运行最多一个任务(即环境锁定)。
    3. 吞吐量优化:当单个环境有多个任务时,可以合并其同步阶段以进行优化。因此,如果任务接近其结尾,则应检查队列中是否有新任务等待此环境,如果有,则跳过其同步阶段。
    4. 实现此目的的首选方法是什么?

      一些想法:

      • 我想说我们必须设置多个队列:每个环境一个队列,并且 N 芹菜工人独家处理一个队列。 (这将解决规范1 + 2。)
        但是,我们如何让多个芹菜工人专门听不同的队列呢?
      • 是否有一种干净的方式可以知道队列中有更多任务在等待环境?

2 个答案:

答案 0 :(得分:2)

表示1,2使用多个队列并使用-Q启动worker以指定要侦听的队列。 同时配置CELERYD_PREFETCH_MULTIPLIER = 1,一次只能执行一项任务。

要获得队列长度(使用rabbitmq测试),您可以使用以下内容:

from kombu.connection import BrokerConnection
connection = BrokerConnection(BROKER_HOST, BROKER_USER...)
channel = connection.channel()
q, j, c = channel.queue_declare('celery', passive=True)
print 'celery %d jobs in queue' % j

'queue_delcare'作为副作用,给你队列的长度。 希望这可以帮到你。

答案 1 :(得分:1)

我会看一下zeromq它可以在一个超快速库中进行消息传递和多线程处理。它还支持大量语言,并内置负载平衡。