【问题标题】:What is the optimal way to organize infinitely looped work queue?组织无限循环工作队列的最佳方式是什么?
【发布时间】:2012-03-04 17:18:05
【问题描述】:

我有大约 1000-10000 个作业,我需要每分钟左右持续运行这些作业。有时会有新工作进来或需要取消其他工作,但这种情况很少见。工作被标记并且必须在工人之间受到干扰,他们每个人只处理特定类型的工作。

现在我想使用 cron 并在某个代理中加载整个作业数据库——RabbitMQ 或 beanstalkd(虽然还没有决定使用哪一个)。

但这种方法对我来说似乎很难看(使用计时器来模拟无穷大,加载整个数据库等)并且有缺点:例如,如果某种作业的处理速度比添加到队列中的速度慢,它可能会不堪重负并且消息经纪人会吃掉所有的 ram,交换然后停止。

还有其他可能吗?我在工作中没有使用正确的模式吗? (可能我不需要队列什么的..?)

附言如果这很重要,我正在使用 python。

【问题讨论】:

    标签: python queue rabbitmq task-queue beanstalkd


    【解决方案1】:

    您创建初始批次的作业并将它们添加到队列中。 您有 n 个队列的消费者,每个消费者都在运行作业。将消费者添加到队列中只需轮询将作业分配给每个侦听消费者,从而为您提供任意水平可扩展性。

    每个作业都可以在完成后负责将自己重新提交回队列。这意味着您的作业队列不会超过初始化时的长度。 如果需要,主作业可以生成子作业并将它们添加到队列中。

    对于不同类型的作业,使用不同的队列可能是个好主意。这样,您可以通过让不同数量/马力的工作人员从不同的队列中运行作业来更有效地平衡负载。

    您正在运行 Python 的事实在这里并不重要,您需要首先确定的是模式,而不是语言。

    【讨论】:

    • 我明白了。如果我有几百万个作业,那么我将无法一次将它们加载到队列中,我应该使用什么模式来填充队列?
    • 为什么不能在队列中填充数百万个作业?兔子不在乎。只需将您的工作投入其中,让它们飞起来。
    【解决方案2】:

    您可以使用异步框架,例如扭曲的

    我认为每分钟通过 cron 守护程序运行脚本也不是一个好主意(你提到了原因),所以我为你提供 Twisted。它不会给你带来调度的好处,但你可以在进程管理和内存共享方面获得灵活性

    【讨论】:

    • 您可能会提供比您的答案更多的细节!
    • 我试图理解它,但它似乎对我来说太难了。如果理解正确,twisted 是异步的,是 IO 意义上的,对吧?所以调度没有好处?
    猜你喜欢
    • 2010-11-09
    • 1970-01-01
    • 2013-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多