2012-03-04 62 views
0

我有大约1000-10000个工作,我需要每分钟左右持续运行。有时会有新工作或其他需要被取消,但这是罕见的事件。工作被标记并且必须在工作人员中受到干扰,他们每个人只处理特定类型的工作。组织无限循环工作队列的最佳方式是什么?

现在我想使用cron并在一些broker中加载作业的整个数据库 - RabbitMQ或beanstalkd(还没有决定使用哪一个)。但是这种方法对我来说似乎很难看(使用计时器来模拟无穷大,加载整个数据库等),并且具有缺点:例如,如果某些作业的处理速度比添加到队列中的速度慢,它可能会被淹没,消息经纪人会吃掉所有内存,交换然后停下来。

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

p.s.如果这很重要,我使用python。

回答

1

您可以创建初始批作业并将其添加到队列中。 您有每个正在运行作业的队列的n个使用者。将消费者添加到队列中只需简单地将作业分配给每个倾听消费者,从而为您提供任意的横向可伸缩性。

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

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

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

+0

我明白了。如果我有几百万个工作,那么我将无法一次将它们加载到队列中,我应该使用什么样的模式来填充队列? – Moonwalker 2012-03-07 06:57:49

+0

你为什么不能用几百万个工作来填充队列?兔子不在乎。把你的工作放在那里,让他们飞。 – 2012-03-07 12:06:26

+0

谢谢。现在一切都很清楚。 – Moonwalker 2012-03-07 12:52:28

0

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

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

+0

你可能会提供比你的答案更详细的一点! – 2012-03-06 09:13:01

+0

我试着理解它,但对我来说似乎太难了。如果正确理解扭曲是异步的IO感,对吧?所以在调度中没有好处? – Moonwalker 2012-03-06 09:54:37

相关问题