我有一个架构问题。在集群 Web 应用环境中,我能想到三种处理后台作业的方法:
- 让专用机器运行所有作业,从而使 Web 服务器无需再执行这些任务
- 让每个 Web 服务器也运行后台作业,使用一种机制来确保没有两台机器启动相同的作业
- 让其中一个 Web 服务器兼作 jobs-runner
首选方法是什么?
答案1
IANAExpert,但我认为选项 1 更可取。这背后的原因是简单的关注点分离。如果作业有自己的专用机器,您可以更好地管理增长。如果您使用选项 2,您将拥有与其要求不匹配的作业处理潜力。虽然无论是一台机器还是多台机器运行作业,所使用的资源都应该相同,但我认为无论您使用哪种排队系统都会有一些开销。此外,如果队列或 Web 服务器出现问题,您不会拖垮另一个。您已经将应用程序的每个部分都孤立起来,因此您可以根据需要而不是根据架构要求进行增长。
答案2
每个选项都有利弊,无论如何,选择首选方式都需要更多信息(恕我直言)。例如,什么样的后台作业?这是一个关键问题,因为例如,如果业务流程可能很有趣,那么可以利用现有的集群。
例如,如果维护过程与业务(或用户需求)没有直接关系,那么拥有独立的硬件(或虚拟)可能更有意义。
根据我的经验,有时候,我们所有人都不太愿意充分利用集群,但集群已经准备好使用它们了!
答案3
如果您有资源,并且后台任务的运行位置并不重要,我会选择选项 1。
这样做没有任何理由,除非如果没有必要,为什么要给你的网络服务器增加负担。
答案4
Peldi,请考虑使用一种允许拥有单个作业队列(最好在数据库中)和一个或多个作业运行器的方法。这样,您可以在一台或不同的机器上运行一个或多个作业工作者 - 这将使您的配置更加灵活。
我不知道你要运行什么样的任务,以及要使用哪种技术,但在 Ruby/Rails 世界中,这样的任务可以使用以下方法解决延迟作业
有关后台处理的一些其他信息,请访问http://en.wikipedia.org/wiki/Job_scheduler
就我个人而言,在我的项目中,我在数据库所在的同一台机器上运行后台作业,但如果有需要,我可以稍后添加更多的工作者/机器。
希望这可以帮助 :)