我们有一个Java Web服务,用于生成运行带有Apache Tomcat的Spring MVC的报告。客户端是另一个Java Tomcat Web应用程序(我们的主要网站)。该服务允许客户端添加对报告的请求,通过每隔几秒钟轮询一次服务来监视该请求的状态,并在报告成功时获取报告输出,或者在报告失败时(或在完成后稍后)获取错误详细信息。用户还具有查看自登录后运行的所有报告作业的能力。管理员应该能够查看所有活动和已完成的作业。
当前,这是使用内存队列来实现的。当报告请求进入时,它被添加到队列中。服务器监视队列,并且当资源可用时,线程开始处理下一个请求。线程通过直接写入队列直到成功或失败来更新作业状态。
我正在寻求引入负载平衡以允许更多同时报告容量。如果可能的话,我真的很想使用一种现成的解决方案,例如可用于Apache httpd的解决方案。最大的问题是,如何处理队列。正如我所看到的,有两个主要问题,还有一些值得关注的问题。主要问题是:
在路由作业状态请求时,知道哪个作业在哪个服务器的队列中。通过使用会话粘性,这实际上可能是可以解决的,尽管由于#2而我没有弄清细节
获取所有服务器上所有作业(或一个用户的所有作业)的状态。基本上,必须查询来自所有服务器的所有队列。
拥有的好处涉及负载平衡的细节。例如,我可以使用每个服务器的队列长度来决定将请求路由到具有最小队列的服务器吗?
现在,我知道一种解决方案是使用数据库来跟踪队列,方法是将对队列的所有写操作镜像到报表服务器上的数据库,并在客户端上轮询数据库,或者通过完全合并来自将服务器合并到数据库中的一台,并让服务器在获得可用资源时接管工作。我担心频繁请求淹没数据库会导致性能下降,从而部分抵消负载平衡的好处。有更好的方法吗?
预先感谢