我有大约1000-10000个工作,我需要每分钟左右持续运行。有时新工作进入或其他需要取消,但这是罕见的事件。工作被标记,并且必须在工人之间受到干扰,他们每个人都只处理特定类型的工作。
现在我想在某些代理中使用cron并加载整个作业数据库 - RabbitMQ或beanstalkd(虽然没有决定使用哪一个)。
但这种方法对我来说似乎很难看(使用计时器来模拟无限,加载整个数据库等)并且有缺点:例如,如果处理某种类型的作业比添加到队列中的作业慢,那么它可能会不堪重负并且消息经纪人会吃掉所有公羊,交换然后停下来。
还有其他可能吗?我没有使用正确的模式来完成工作吗? (可能我不需要排队等等......?)
P.S。如果这很重要,我正在使用python。
答案 0 :(得分:1)
您可以创建初始一批作业并将其添加到队列中。 每个运行作业的队列都有n个消费者。将消费者添加到队列只是简单地将作业分配循环到每个收听消费者,为您提供任意的水平可伸缩性。
每个作业一旦完成,就有责任将自己重新提交回队列。这意味着您的作业队列不会超出初始化时的长度。 如果需要,主作业可以生成子作业并将它们添加到队列中。
对于不同类型的工作,使用不同的队列可能是个好主意。这样,您可以通过从不同队列运行作业的不同数量/马力来更有效地平衡负载。
您运行Python的事实在这里并不重要,它是模式,而不是您需要先确定的语言。
答案 1 :(得分:0)
您可以使用异步框架,例如扭曲
我不认为每分钟都有cron守护进程运行脚本是个好主意(并且你提到了原因),所以我给你提供Twisted。它不会给您带来日程安排的好处,但您可以灵活地进行流程管理和内存共享