0

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

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

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

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

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

4

2 回答 2

2

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

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

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

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

于 2012-03-05T13:47:07.177 回答
0

您可以使用异步框架,例如 Twisted

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

于 2012-03-06T05:43:59.273 回答