Decouple web services from other backend heavy computing service in Java
我使用Java/Spring MVC/Tomcat来提供我的Web服务,并将我的REST API暴露给移动客户端。我现在对网络表面的一切都很满意。问题是,我的应用程序在其核心上有一个非常沉重的计算过程,它调用一个单独的Java程序来处理图像,并将计算的数据返回给Web服务。有时它会占用我的EC2实例内存,或者导致一个异常关闭我的Tomcat7服务器。
问题:现在一切都在同一个tomcat7容器下运行,我正在寻求一个解决方案来将这两个容器分离开来,以便将它们安装在不同的服务器上,也许可以单独为计算程序找到一个高内存服务器。
有哪些选项可以让我将它们脱钩并提高可扩展性和稳定性?
更新:我可以通过编程或从命令行调用计算引擎。
更新2:我根据答案做了一些研究。当我在另一篇文章中读到阿帕奇骆驼到底是什么?我觉得我应该多学点关于EIP模式的知识。希望它不会被过度杀戮。
基于建议的解决方案在阅读了EIP概念、Camel in Action、ActiveMQ之后,我终于想出了一个解决方案。它可能不优雅,但它起作用了。建议和意见将不胜感激!我编写了一个基于ApacheCamel的队列路由器,连接到ActiveMQ代理,并在一台服务器上作为独立程序运行。运行在独立容器中的计算引擎和路由器负责处理Web服务器中我的Spring容器中的JMS请求程序。稍后,如果需要更密集的计算,我只需要从camel配置计算引擎的负载平衡。
如果我理解正确,您似乎需要一个负载均衡器。
让负载均衡器路由到WebService/Compute引擎的多个实例之一。您可以使用ESB、路由引擎、集群、主从、分布式缓存等来实现这一点,其中大多数都是相互关联的。您还可以根据负载在EC2上实时地旋转其他节点。
否则,如果任务可以中断,则将其委托给多个节点/服务。您需要一些编排机制。
有一些开源解决方案可以解决上述1和2的问题。
现在指向的是添加更多硬件。如果这解决了你的问题,你需要仔细考虑。如果您使用的是32位的JVM,那么您可以指定多少堆大小是有限制的。如果您有幸拥有64位的JVM,那么您将有更大的内存空间。但是,在应用程序没有响应的情况下,总是有可能使用过多的CPU。
我更喜欢将计算密集型任务分解成作业,并在单独的JVM中进行计算。将您的作业保存在数据存储/JMS中,这样它们就不会丢失。如果您正在从这些作业进行数据库更新,请务必小心,以避免任何锁定。
后端是否同步工作?我的意思是,当移动客户端请求某些东西时,他们是否必须等待后端进行大量处理?
如果是,您可以水平增长,放置更多的工作节点(后端webapps)和前端nginx或任何平衡器。这是最快的方法。
你有可重用的数据吗?如果是,您可以使用类似memcached的东西。
希望有帮助,如果你能提供更多的信息,我相信我们会提供更好的建议。