java - 将 Web 服务与 Java 中的其他后端重型计算服务分离

标签 java web-services spring-mvc scalability tomcat7

网络应用程序的背景:

我正在使用 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/

相关文章:

web-services - 如何使用名称/值对创建 HTTP POST 的 Mule ESB 服务?

java - 序列化包含 List 字段的对象

java - Eclipse + Velocity = HTTP 状态 500

java - 用Maven包装Gradle项目

java - 在 Activity 的 onDestroy() 中使用 Runtime.getRuntime().gc() 方法是一种好习惯吗?

java - 定义将不同大小的数组打印到表中的Java方法

web-services - 如何创建简单的网页来显示 Jersey Web 服务结果?

java - 如何开发执行 Rest Ws Spring 的客户端 Web 应用程序

java - Spring 无法识别 DateTime 字段的格式

java - 使用 Jackson 反序列化 Json 时将 UnknownFields 保存到 map