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

Synchronization 如何扩展具有守护进程任务的应用程序服务器?,synchronization,jetty,scalability,daemon,Synchronization,Jetty,Scalability,Daemon,我现在有一个在一台服务器上运行的web应用程序。我想切换到应用服务器集群(jetty),以处理增加的负载和故障切换。但是,应用程序有两个守护进程线程,每10分钟运行一次,以处理传入的数据。此数据只能处理一次(它与外部服务器通信,如果处理两次,就会发生不好的事情) 扩展该功能的最佳实践是什么 我的一些选择是: 具有应用程序是否应运行守护进程任务的标志。然后只有其中一个标志设置为true。这是可行的,但这意味着我不再具有简单的故障切换功能——我需要监视那个特殊的应用程序服务器,并在它出现故障时采取措

我现在有一个在一台服务器上运行的web应用程序。我想切换到应用服务器集群(jetty),以处理增加的负载和故障切换。但是,应用程序有两个守护进程线程,每10分钟运行一次,以处理传入的数据。此数据只能处理一次(它与外部服务器通信,如果处理两次,就会发生不好的事情)

扩展该功能的最佳实践是什么

我的一些选择是:

  • 具有应用程序是否应运行守护进程任务的标志。然后只有其中一个标志设置为true。这是可行的,但这意味着我不再具有简单的故障切换功能——我需要监视那个特殊的应用程序服务器,并在它出现故障时采取措施

  • 制定一些系统,让不同的应用程序服务器相互了解,并有一些方法来选择一个节点来运行它,例如,所有人都选择一个随机数,然后哪个节点最高就可以运行它。每10分钟做一次。这具有自动故障切换功能(如果其他节点由于某个节点关闭而无法与该节点通信,则会被忽略),但这也意味着每个应用程序服务器都需要了解其他应用程序服务器,我觉得我正在重新发明轮子


  • 这种情况通常是如何处理的?

    您可以使用Quartz来安排任务,它已经做到了

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


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

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

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