如何扩展具有守护程序任务的应用程序服务器?

时间:2011-05-22 12:51:17

标签: synchronization jetty scalability daemon

我现在有一个在一台服务器上运行的Web应用程序。我想切换到一组应用程序服务器(jetty),以处理增加的负载和故障转移。但是,应用程序有几个守护程序线程,每10分钟运行一次以处理已进入的数据。此数据必须仅处理一次(它与外部服务器通信,并且不良如果它完成了两次就会发生。)

扩展的最佳做法是什么?

我有一些选择:

  1. 有一个标志,表明应用程序是否应该运行守护程序任务。然后只有其中一个标志设置为true。这有效,但这意味着我不再容易进行故障转移 - 我需要监控该特殊应用服务器并在其发生故障时采取措施。

  2. 找出一些系统,其中不同的应用程序服务器了解彼此,并且有一些方法可以选择一个节点来运行它,例如,所有选择一个随机数,无论哪个节点最高都可以运行它。每10分钟做一次。这有自动故障转移(如果其他节点无法与一个节点通信,因为它已关闭,它只是被忽略),但它也意味着每个应用服务器需要了解每个其他应用服务器,我觉得我正在重新发明转到这里。

  3. 这种情况通常如何处理?

2 个答案:

答案 0 :(得分:1)

您可以使用Quartz来安排任务,它有cluster support

除了在Quartz中安排任务外,您还必须使用Quartz的模式创建数据库(或使用现有数据库)。群集中的所有服务器必须同步其时间(ntpd将执行此操作)。

使用Quartz将为您提供故障转移,负载平衡以及每个任务仅执行一次的保证。

答案 1 :(得分:0)

为什么不使用数据库进行协调?具有空闲周期的任何节点都可以在作业表中插入“进行中”行以锁定其他节点。这利用了这样一个事实,即您可能已经在所有节点中依赖单个数据库,这已经内置了事务管理。

您需要设计一个简单的计时算法,以确保所有节点每十分钟不会同时唤醒并争取锁定。也许会引入0-10秒的随机延迟。