我有几年用PHP开发Web应用程序的经验,我也广泛使用Java(但从未用于Web应用程序开发)。我正在完成一个大型项目,过去六个月我一直在使用PHP / CodeIgniter构建并使用CloudControl托管(提供自动服务器配置和可伸缩性)。
该项目进展顺利,PHP满足了我的需求 - 但现在我正处于开发一个针对企业用户的Web应用程序的开始阶段,我正在考虑使用Java(可能是'Grails')与AWS Elastic Beanstalk结合使用。
我的第一个问题是:多线程,它在Java的Web应用程序开发中使用的频率是多少?使用我的PHP应用程序,我的服务器可能需要根据用户的请求(例如发布到用户的墙上)向facebook发出API调用。为了避免我的PHP进程在返回用户之前等待API调用完成,我使用Gearman作业排队服务器w / workers将工作从我的主应用程序服务器卸载到后台工作程序。
Java开发人员是否只是简单地启动一个线程来处理API调用并让主进程返回给用户?这是Java开发优于PHP的最大优势吗?谢谢!
答案 0 :(得分:2)
Java开发人员是否只是为了处理API调用而启动一个线程并让主进程返回给用户?
取决于。
如果你这样做,那么原始线程可以做一些其他事情,但除非它被设计为基于事件,那么它最终将需要等待辅助线程完成...并且你回来了你从哪里开始的。 (实际上你的情况更糟......因为你现在有2个线程在等待。)
对于使用传统Java servlet实现的Web服务器,每个用户请求都在其自己的线程上运行。简单的方法是在请求线程上执行API调用。这会阻塞线程,但是其他线程可以在其他请求上进行操作。假设您在Web容器的线程池中有足够的线程,这可以正常工作......尽管您最终在线程堆栈上使用了大量资源(内存)。
最新版本的Java servlet规范增加了对异步处理的支持。我不能快速了解细节,但理论上这可以让你将请求线程与请求断开连接,而后者正在做一些需要很长时间的事情。但是,我不相信这会有所帮助...除非你有一个客户端实现的API,它同样能够使用一小部分(并且有限)的Java线程并行运行多个并发请求。
可能还有其他选择,但它们可能会有更多的工作。
我的建议是寻求一个简单的解决方案。只需在请求线程上执行API调用,并将Web服务器配置为使用合理数量的请求线程。
您可能会因为“浪费”一些内存而获得实际需要的吞吐量。从长远来看,您可能需要解决这个问题,但到那时您将有时间了解更多可扩展的替代方案。