【问题标题】:How can NodeJS scale an enterprise application?NodeJS 如何扩展企业应用程序?
【发布时间】:2013-01-16 23:31:58
【问题描述】:

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

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

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

【问题讨论】:

  • 如果瓶颈在数据库中,为什么使用不同的应用层来解决问题?
  • 这里有什么不清楚的地方吗?下面的答案应该可以澄清。

标签: node.js architecture software-design


【解决方案1】:

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

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

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

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

【讨论】:

  • 我理解 NodeJS 中的“除了你的代码之外,节点中的所有东西都是并行运行的”概念。但是,我的问题是“如果对于大多数请求,我的应用程序必须进行某种内存后处理(例如,在从 db 检索数据之后),那么我的应用程序架构会是什么样子?写所有Node 中的内存后处理?还是像我现在一样拥有多线程前端,只将数据检索任务外包给 Node?​​span>
  • 我认为很难对数据库后处理做出预设响应。您是否只是在更新一些非常快的内存数据结构(变量)?当然——你阻塞了循环,但它不是 I/O——你只是在更新内存。是不是更复杂的处理和数据结构甚至可能需要横向扩展?看看 Redis、memcachedb 等......他们有异步读/写。顺便说一句,像您所描述的那样适合内存的状态非常适合 Redis 和节点。还有其他纯粹在内存中的缓存模块。
猜你喜欢
  • 2015-05-23
  • 1970-01-01
  • 2019-09-15
  • 2018-06-07
  • 1970-01-01
  • 2021-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多