假设我有一个基本上执行以下操作的企业Java应用程序:
收集用户输入,查询后端数据库(可能是多个),运行一些算法(比如对查询数据集进行一些内存计算以产生一些统计数据等),然后在一些html页面中返回数据。
我的问题是:如果应用程序的瓶颈在db查询上,那么NodeJS如何在这种情况下帮助我,因为在渲染页面之前我还需要做所有那些post-db算法?应用程序架构如何?
答案 0 :(得分:3)
当然,节点无法加速您的存储层,并使得那么多后端处理的单个请求更快地满足最终用户的请求。但它能做的不是在应用服务器线程池中绑定一个线程。单个线程可以继续循环,同时正在进行该工作并接受另一个请求。
其他请求可能是一个更便宜的请求,当它完成工作时将返回。这也可能发生在具有线程池模型的应用程序服务器中......除非线程池模型中的所有线程都被阻塞在I / O请求上 - 以及每个线程的开销。更便宜的请求将排队等待线程池中的线程,因为它们都是阻塞的。节点单线程将循环并服务于廉价请求。
这是因为节点要求所有I / O都是异步的,并且阻止循环的唯一工作就是代码。这就是为什么说“everything in node runs in parallel except your code”。虽然可以在其他应用程序服务器中编写异步代码并获得类似的结果,但许多提供非异步线程池模型,其中编码更容易但有时可扩展性更低。
例如,this hanselman post说明了asp.net如何能够执行异步请求,但它并不是大多数人使用的常用模型。