将 Web 服务与 Java 中的其他后端重计算服务分离
Posted
技术标签:
【中文标题】将 Web 服务与 Java 中的其他后端重计算服务分离【英文标题】:Decouple web services from other backend heavy computing service in Java 【发布时间】:2012-08-23 10:39:02 【问题描述】:网络应用背景:
我正在使用 java/spring-mvc/tomcat 来提供我的 Web 服务,并将我的 restful API 暴露给移动客户端。我现在对网络表面上的一切都很满意。问题是我的应用程序的核心有一个非常繁重的计算过程,它调用一个单独的 Java 程序来处理图像并将计算数据返回给 Web 服务。 它有时会占用我的大量 EC2 实例内存,或者导致关闭我的 Tomcat7 服务器的异常。
问题:
现在一切都在同一个 tomcat7 容器下运行,我正在寻找一种解耦这两者的解决方案,以便我可以将它们安装在不同的服务器上,或者单独为计算程序找到一个高内存服务器。
有哪些选项可以让我将它们解耦并提高可扩展性和稳定性?
更新:
我可以通过编程方式或从命令行调用计算引擎。
更新2:
我根据答案做了一些研究。当我在另一篇关于What exactly is Apache Camel? 的帖子中读到时,我觉得我可能应该多了解一些关于 EIP 模式的知识。希望这不是矫枉过正。
基于建议的解决方案
看完了EIP概念,骆驼在行动,activemq,终于想出了一个解决方案。它可能不优雅,但它正在工作。建议和 cmets 将不胜感激! 我编写了一个基于 apache-camel 的队列路由器,连接到 activemq 代理并在一台服务器上作为独立程序运行。在独立容器中运行的计算引擎和路由器负责处理来自 web 服务器中我的 spring 容器的 jms 请求者。以后如果需要进一步的密集计算,我只需要为camel的计算引擎配置负载平衡。
【问题讨论】:
假设,也许吧?催眠是不同的东西。 @ryo 你能在服务器没有负载的情况下缓存图片并计算它们吗? @Eugene,感谢您的建议。是的,我可以做到。但是,我的稳定性仍然存在问题,有时运行计算程序会关闭tomcat。如果有办法解耦,我可以向主服务器抛出一些异常,然后主服务器改变请求到其他计算服务器。 【参考方案1】:现在指向的是添加更多硬件。你需要考虑一下这是否能解决你的问题。例如:如果您使用的是 32 位 JVM,那么您可以指定多少堆大小是有限制的。如果幸运地拥有 64 位 JVM,那么您将拥有更大的内存空间。但是总是有可能使用过多的 CPU 导致您的应用程序变得无响应。
我更喜欢将计算密集型任务分解为作业,并在单独的 JVM 中解决它们。将您的作业保存在数据存储/JMS 中,以免它们丢失。如果您从这些作业中进行数据库更新,请小心以避免任何锁定。
【讨论】:
嗨,Suresh,我使用的是 64 位 JVM,我为我的计算程序微调了 JVM。您能否详细说明如何将任务分解为作业并在单独的 JVM 中工作。谢谢 我隔离了不需要在用户线程中执行的批处理作业,并在不面向用户的节点上运行它们。这意味着集群中至少有两个节点。一个用户面向用户,另一个用户对由石英等调度程序启动的作业进行批处理。 另一种可能性,如果您基于某些用户激活的任务启动图像处理作业。与其在同一台机器的 java 进程中启动图像处理作业,不如将消息发布到 JMS 队列并让 JMS 侦听器在您的机器外处理图像信息。 是的,我认为这些是替代方案。我会研究这两种可能性,谢谢!【参考方案2】:如果我理解正确,您似乎需要一个负载平衡器。
让负载平衡器路由到您的 Web 服务/计算引擎的多个实例之一。您可以使用 esb、路由引擎、集群、主从、分布式缓存等实现这一点,其中大多数是相互关联的。 您还可以根据负载在 EC2 上实时启动其他节点。
否则,如果任务可以中断,则将其委托给多个节点/服务。您将需要一些编排机制。
有开源解决方案可以解决上面的 1 和 2。
【讨论】:
感谢您的建议,javausersoma。我将在我的生产环境中使用负载均衡器,但如果可能的话,我仍然想找到一种方法来解耦 web 服务/计算引擎。计算引擎可以分解为不同的任务或在其他 JVM 中运行。我有兴趣“将其委托给多个节点/服务”。你能告诉我一些关于它的事情,以便我可以开始在谷歌上搜索。 :) 谢谢! ryo,如果您正在查看实时场景,您可以在 esb 本身中进行分解。如果计划在 esb 中使用骆驼,它提供了一个选项来组合来自多个调用的结果,使用聚合和并行处理。可能许多 esb 都有类似的机制。工作流和活动编排是一些想法,但它们不是很实时。 我将阅读更多关于骆驼的内容,因为它支持弹簧框架。谢谢!【参考方案3】:后端是否同步工作?我的意思是,当移动客户端请求某些东西时,他们是否必须等待后端进行大量处理?
如果是,您可以水平增长,放置更多工作节点(后端 web 应用程序)和前端 nginx 或任何平衡器。这是最快的方法。
您有可重复利用的数据吗?如果是,你可以使用 memcached 之类的东西。
希望对您有所帮助,如果您提供更多信息,我相信我们会提供更好的建议。
【讨论】:
嗨psabbate,手机和网站会同步请求处理后的图像数据,其实我在前端做了一些工作等待后端计算。我真的希望我可以在 Web 服务中拥有某种“主从”模式,如果客户端请求任何数据,Web 服务将创建一个作业并发送到从站,从站可以处理它。以上是关于将 Web 服务与 Java 中的其他后端重计算服务分离的主要内容,如果未能解决你的问题,请参考以下文章