【问题标题】:How do you scale an application server that has daemon tasks?如何扩展具有守护程序任务的应用程序服务器?
【发布时间】:2011-05-22 12:51:17
【问题描述】:

我现在有一个在一台服务器上运行的 Web 应用程序。我想切换到应用程序服务器集群(码头),以处理增加的负载和故障转移。但是,该应用程序有几个守护线程,它们每 10 分钟运行一次,以处理传入的数据。这些数据必须只处理一次(它与外部服务器通信,并且不好如果执行两次,事情就会发生)。

进行扩展的最佳做法是什么?

我的一些选择是:

  1. 有一个应用程序是否应该运行守护程序任务的标志。然后只有其中一个将该标志设置为 true。这可行,但这意味着我不再有简单的故障转移 - 我需要监控那个特殊的应用程序服务器并在它出现故障时采取行动。

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

这种情况通常如何处理?

【问题讨论】:

    标签: synchronization jetty scalability daemon


    【解决方案1】:

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

    除了在 Quartz 中安排任务之外,您还必须使用 Quartz 的模式创建一个数据库(或使用现有的数据库)。集群中的所有服务器都必须同步它们的时间(ntpd 会这样做)。

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-08
        • 2010-11-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多