将 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 中的其他后端重计算服务分离的主要内容,如果未能解决你的问题,请参考以下文章

解决前后端分离开发,后端重定向不到前端页面问题

解决前后端分离开发,后端重定向不到前端页面问题

提交php表单并从后端重定向

后端重定向vue页面发生跨域并且页面没跳转

apache_conf 将TYPO3后端重定向到https

如何在不重新加载页面的情况下将服务器端重定向到其他页面并仍将 URL 保留在 Nextjs 应用程序中?