网络应用程序的背景:
我正在使用 java/spring-mvc/tomcat 来提供我的 Web 服务,并向移动客户端公开我的 Restful API。我对现在网络上的一切都很满意。问题是我的应用程序的核心有一个非常繁重的计算过程,它调用一个单独的 Java 程序来处理图像并将计算数据返回到 Web 服务。 它有时会耗尽我的大量 EC2 实例内存,或者导致异常关闭我的 Tomcat7 服务器。
问题:
现在一切都在同一个 tomcat7 容器下运行,我正在寻找一种解决方案来解耦这两个容器,以便我可以将它们安装在不同的服务器上,也许找到一个单独用于计算程序的高内存服务器。
有哪些选项可以让我解耦它们并提高可扩展性和稳定性?
更新:
我可以通过编程方式或从命令行调用计算引擎。
更新2:
我根据答案做了一些研究。当我读到另一篇关于 What exactly is Apache Camel? 的文章时,我觉得我应该更多地了解 EIP 模式。希望这不是矫枉过正。
基于建议的解决方案
在阅读了EIP概念、camel in action、activemq之后,我终于想出了一个解决方案。它可能不优雅,但它确实有效。建议和意见将不胜感激! 我编写了一个基于 apache-camel 的队列路由器,连接到 activemq 代理并在一台服务器中作为独立程序运行。在独立容器中运行的计算引擎和路由器负责处理来自 Web 服务器中的 Spring 容器的 jms 请求者。稍后如果需要进一步的密集计算,我只需要为camel的计算引擎配置负载平衡即可。
最佳答案
现在的目标是添加更多硬件。您需要考虑一下这是否可以解决您的问题。例如:如果您使用 32 位 JVM,则可以指定的堆大小是有限的。如果你幸运地拥有 64 位 JVM,那么你将拥有更大的内存空间。但总有可能使用过多的 CPU,导致应用程序变得无响应。
我更喜欢将计算密集型任务分解为作业并在单独的 JVM 中解决它们。将您的作业保留在数据存储/JMS 中,以免丢失。如果您要从这些作业中进行数据库更新,请务必小心,以避免任何锁定。
关于java - 将 Web 服务与 Java 中的其他后端重型计算服务分离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12167438/