我正在使用java / spring-mvc / tomcat来提供我的Web服务以及向移动客户端公开我的restful API。我现在很满意网络表面上的所有内容。问题是我的应用程序在其核心有一个非常繁重的计算过程,它调用一个单独的Java程序来处理图像并将计算数据返回给Web服务。 它有时会占用我的EC2实例内存,或导致关闭我的Tomcat7服务器的异常。
现在一切都在同一个tomcat7容器下运行,我正在寻找一个解决方案来解耦这两个,以便我可以将它们安装在不同的服务器上,也许只为计算程序找到一个高内存服务器。
有哪些选项允许我将它们分离并提高可扩展性和稳定性?
我可以通过编程方式或命令行调用计算引擎。
我根据答案做了一些研究。当我读到关于What exactly is Apache Camel?的另一篇文章时,我觉得我应该更多地了解一下EIP模式。希望它不是矫枉过正。
通过阅读EIP概念,骆驼在行动,activemq,我终于想出了一个解决方案。它可能不优雅,但它正在发挥作用。建议和意见将不胜感激! 我写了一个基于apache-camel的队列路由器,连接到activemq broker并在一台服务器上作为独立程序运行。计算引擎在独立容器中运行,路由器负责从Web服务器中的spring容器处理jms请求程序。稍后,如果需要进一步的密集计算,我只需要为camel计算引擎配置负载均衡。
答案 0 :(得分:1)
现在正指向的是添加更多硬件。如果这可以解决您的问题,您需要仔细考虑。例如:如果您使用的是32位JVM,则可以指定多少堆大小。如果你很幸运拥有64位JVM,那么你将拥有更大的内存空间。但是,在应用程序无响应的情况下,总是有可能使用过多的CPU。
我更喜欢将计算密集型任务分解为作业,并在单独的JVM中进行处理。将您的工作保留在数据存储区/ JMS中,以免它们丢失。如果要从这些作业执行数据库更新以避免任何锁定,请务必小心。
答案 1 :(得分:1)
如果我理解正确,您似乎需要负载均衡器。
让负载均衡器路由到您的Web服务/计算引擎的多个实例之一。您可以使用esb,路由引擎,集群,主从,分布式缓存等来实现这一点,其中大多数是相互关联的。 您还可以根据负载在EC2上实时启动其他节点。
否则,如果任务可以被破坏,则将其委托给多个节点/服务。您将需要一些编排机制。
有开源解决方案可以解决上面的1和2。
答案 2 :(得分:0)
后端是否同步工作?我的意思是,当移动客户端请求某些内容时,他们必须等待后端进行大量处理吗?
如果是,您可以横向扩展,放置更多工作节点(后端Web应用程序)和前端Nginx或任何平衡器。这是最快的方式。
您是否有可重复使用的数据?如果是的话,你可以使用像memcached这样的东西。
希望有所帮助,如果您向我们提供更多信息,我相信我们会提供更好的建议。