2

Web应用程序的背景:

我正在使用 java/spring-mvc/tomcat 来提供我的 Web 服务,并将我的 restful API 暴露给移动客户端。我现在对网络表面上的一切都很满意。问题是我的应用程序的核心有一个非常繁重的计算过程,它调用一个单独的 Java 程序来处理图像并将计算数据返回给 Web 服务。它有时会占用我的大量 EC2 实例内存,或者导致关闭我的 Tomcat7 服务器的异常。

问题:

现在一切都在同一个tomcat7容器下运行,我正在寻找一种解耦这两个的解决方案,以便我可以将它们安装在不同的服务器上,也许可以单独为计算程序找到一个高内存服务器。

有哪些选项可以让我将它们解耦并提高可扩展性和稳定性?

更新:

我可以以编程方式或从命令行调用计算引擎。

更新2:

我根据答案做了一些研究。当我在另一篇文章中阅读有关Apache Camel 到底是什么?,我觉得我可能应该多学习一些关于 EIP 模式的知识。希望这不是矫枉过正。

基于建议的解决方案

通读了EIP概念、camel in action、activemq,终于想出了一个解决方案。它可能不优雅,但它正在工作。建议和意见将不胜感激!我编写了一个基于 apache-camel 的队列路由器,连接到 activemq 代理并在一台服务器上作为独立程序运行。在独立容器中运行的计算引擎和路由器负责处理来自 web 服务器中我的 spring 容器的 jms 请求者。稍后,如果需要进一步的密集计算,我只需要从骆驼配置计算引擎的负载平衡。

4

3 回答 3

1

现在指向的是添加更多硬件。你需要考虑一下这是否能解决你的问题。例如:如果您使用的是 32 位 JVM,那么您可以指定多少堆大小是有限制的。如果幸运地拥有 64 位 JVM,那么您将拥有更大的内存空间。但是总是有可能使用过多的 CPU 导致您的应用程序变得无响应。

我更喜欢将计算密集型任务分解为作业并在单独的 JVM 中解决它们。将您的作业保存在数据存储/JMS 中,以免它们丢失。如果您从这些作业中进行数据库更新,请小心以避免任何锁定。

于 2012-08-28T21:13:19.030 回答
1

如果我理解正确,您似乎需要一个负载平衡器。

  1. 有一个负载均衡器来路由到您的 Web 服务/计算引擎的多个实例之一。您可以使用 esb、路由引擎、集群、主从、分布式缓存等实现这一点,其中大多数是相互关联的。您还可以根据负载在 EC2 上实时启动其他节点。

  2. 否则,如果任务可以中断,则将其委托给多个节点/服务。您将需要一些编排机制。

有开源解决方案可以解决上述 1 和 2。

于 2012-08-29T01:56:27.827 回答
0

后端是否同步工作?我的意思是,当移动客户端请求某些东西时,他们是否必须等待后端进行大量处理?

如果是,您可以水平增长,放置更多工作节点(后端 Web 应用程序)和前端 Nginx 或任何平衡器。这是最快的方法。

你有可重用的数据吗?如果是,您可以使用 memcached 之类的东西。

希望它有所帮助,如果您向我们提供更多信息,我很确定我们会提供更好的建议。

于 2012-08-28T22:23:27.407 回答