【问题标题】:Scaling Scheduler Web Service扩展调度程序 Web 服务
【发布时间】:2014-07-03 22:18:10
【问题描述】:

我们正在开发一个应用程序,它会定期将不同客户端的 LDAP 服务器与我们的数据库同步。此应用程序需要通过 Web 门户访问。 Web 用户将在此应用程序上创建、修改或删除计划任务。因此,我们将此应用程序开发为 Web 服务。

现在,我们必须扩展此应用程序并确保高可用性。

该应用程序是在 Tomcat 上运行的基于 Axis2 的 Web 服务。我们已经想到了 httpd + mod_jk + tomcat 的组合来进行负载均衡。问题是,如果出现修改/删除请求,那么它应该落在最初创建任务的同一 tomcat 服务器上。但是,由于请求可能来自从不同 IP 地址访问 Web 门户的不同 Web 用户,因此我们不能有相同的会话 ID(粘性会话)。

有什么解决办法吗?不同的架构?随便。

我们也想过使用 Quartz scheduler api。该站点表示它支持负载平衡和集群。有没有人有使用 Quartz 处理这种情况的经验?

【问题讨论】:

  • 听起来你的数据库——或者存储任务信息的地方——也是分布式的;即,不是所有 Web 服务器都访问的公共数据库。这就是为什么您需要后续请求转到原始网络服务器的原因吗?
  • 不,所有任务共享公共数据库。
  • 那么,数据库是您可以协调事物的唯一点。您希望后续请求转到同一 Web 服务器的原因是什么?
  • 如果在服务器 A 上为客户端 A 创建了任务,那么后续修改/删除该任务的请求必须发送到同一个 Web 服务器。
  • 是的,我明白了。我的问题是:为什么?毕竟,如果所有状态都存储在一个数据库中,并且该数据库对所有 Web 服务器都是通用的,为什么它们中的任何一个都不能处理后续请求。如果一个人掉了,为什么其他人不能像什么都没发生一样捡起来?我想有一些状态存储在网络服务器中。无论如何,如果这就是你想要的,我不知道你会如何路由它。

标签: java tomcat scalability


【解决方案1】:

如果您使用 Quartz 进行调度,则可以由数据库支持(请参阅 JDBCJobStore)。然后您可以访问任何 Tomcat 服务器,并且调度将是集中的。我建议在您返回给 Axis 服务的数据库中使用一个键,以便用户可以在调用之间引用相同的数据。

或者,将数据库用作作业调度程序并不难,然后让您的任务在 Tomcat(任何位置)上运行,并将结果放入数据库中。如果作业的结果(例如它的状态)很小,则可以正常工作。

【讨论】:

  • 我将不得不为 Quartz 和 JDBCJobStore 做一些 POC,从未使用过这些。
猜你喜欢
  • 1970-01-01
  • 2011-05-10
  • 2011-02-03
  • 2023-04-06
  • 2013-06-26
  • 2011-02-13
  • 1970-01-01
  • 2012-05-27
  • 2013-07-25
相关资源
最近更新 更多