您至少要处理两个问题:
他们每个人都需要不同的解决方案。
一般来说,我会推荐使用任务队列来完成这种分配(我已经尝试过并且对在 Amazon EC2 上运行的Celery感到非常满意)。
任务队列的一个优点是它从实际执行任务的工作人员中抽象出任务的定义。因此,您将任务发送到队列,然后可变数量的工作人员(具有多个工作人员的服务器)通过一次请求一个来处理这些任务。每个空闲的工作人员都会连接到队列并请求一些工作。如果它收到它(一个任务),它将开始处理它。然后它可能会发回结果并要求另一个任务,依此类推。
这意味着许多工作人员可以随时间变化,他们将自动处理队列中的任务,直到没有更多任务要处理。用例是使用 Amazon 的 Spot 实例,这将大大降低成本。只需将您的任务发送到队列,创建 X 个现场请求并查看处理您任务的服务器。你真的不需要关心服务器在任何时候上下波动,因为价格高于你的出价。这很好,不是吗?
现在,这隐含地负责监控——因为 celery 有监控队列和处理的工具,它甚至可以使用django-celery与 django 集成。
在将代码部署到多个服务器时,Celery 不支持。这背后的原因具有不同的性质,请参见此讨论。其中之一可能是它很难实施。
我认为没有它也可以生活,但如果你真的在乎,我认为有一个相对简单的 DIY 解决方案。将您的代码放在 VCS 下(我推荐Git)并定期检查更新。如果有更新,请运行一个 bash 脚本,该脚本将杀死您的工作人员,进行所有更新并再次启动工作人员,以便他们可以处理更多任务。鉴于 Celerys 处理故障的能力,这应该可以正常工作。