2

假设我有一个企业 Java 应用程序,它基本上执行以下操作:

收集用户输入,查询后端数据库(可能是多个),运行一些算法(比如对查询的数据集进行一些内存计算以产生一些统计数据等),然后在一些 html 页面中返回数据。

我的问题是:如果应用程序的瓶颈在 db 查询上,那么 NodeJS 在这种情况下如何帮助我,因为我仍然需要在渲染页面之前执行所有这些 post-db 算法?应用程序架构是什么样的?

4

1 回答 1

3

当然,节点无法加速您的存储层,也无法让导致如此多的后端处理的单个请求更快地满足最终用户的请求。但它可以做的不是在应用服务器线程池中占用一个线程。当工作正在进行时,单个线程可以继续循环并接受另一个请求。

另一个请求可能是一个更便宜的请求,它会在它的工作完成后返回。这也可能发生在具有线程池模型的应用程序服务器中……除非线程池模型中的所有线程都被阻塞在 I/O 请求上 - 以及每个线程的开销。较便宜的请求将排队等待线程池中的线程,因为它们都是阻塞的。节点单线程将循环并服务廉价请求。

这是可行的,因为节点要求所有 I/O 都是异步的,并且阻塞循环的唯一工作是您的代码。这就是为什么说“节点中的所有内容都并行运行,除了你的代码”。虽然可以在其他应用程序服务器中编写异步代码并获得类似的结果,但许多提供非异步线程池模型,其中编码更容易,但有时可扩展性较差。

例如,这篇 hanselman 帖子说明了 asp.net 如何能够执行异步请求,但这并不是大多数人使用的通用模型。

于 2013-01-17T00:26:43.683 回答