将NodeJS用于大型项目

时间:2012-02-29 05:04:55

标签: javascript node.js

NodeJS是大型服务器端应用程序的良好框架/代码库吗?我想要开发的是一个需要HTTP事务(状态)和大量并发用户的大型应用程序。

从我在网上看到的,NodeJS并不是大型程序使用的最佳工具。我遇到的情况如下:

  • NodeJS在JavaScript上运行,JavaScript在事件循环上运行,在批量使用时效率不高。
  • NodeJS可能是非阻塞的,但所有请求都在一个线程内处理,因此当处理许多请求时,这可能会造成一些瓶颈。
  • NodeJS构建在自己的HTTP服务器上,因此未来的维护将需要自己的sysadmin / developer hybrid来处理应用程序。
  • NodeJS没有那么多经过充分测试和多样化的软件可以帮助您构建更大的应用程序。

有什么我想念的吗? NodeJS真的像它一样强大吗?

6 个答案:

答案 0 :(得分:46)

  

NodeJS是大型服务器端应用程序的良好框架/代码库吗?

这个问题有点主观,但我在实际的客观要点中解决了在大型项目中使用节点时遇到的实际问题。

在项目工作一段时间后更新:

最好是作为I / O绑定的前端/ API服务器(大多数前端/ api服务器都是)。如果你有后端计算需求(处理等......),它可以配对其他技术(C#net core,go,Java等...工作节点)

我创建此项目作为说明大多数要点的示例 - Sane Node Development https://github.com/bryanmacfarlane/sanenode

NodeJS不是在自己的http服务器上构建的。它是在V8 chrome javascript引擎上构建的,不承担http服务器。有一个内置的http模块以及流行的express web server,但也有套接字模块(以及socket.io)。它不仅仅是一个http服务器。

单个线程不会导致瓶颈,因为所有I / O都是偶数和异步的。此链接很好地解释了这一点:http://blog.mixu.net/2011/02/01/understanding-the-node-js-event-loop/

就软件模块而言,您可以在npm registry进行搜索。总是看看有多少其他人使用它(下载)并访问github repo以查看它是否正在积极维护(或者是否有一堆问题从未引起注意)。

关于“大型项目”,我发现对于理智发展至关重要的是:

  1. 编译时间支持(和智能感知):编译时发现问题。如果你认为你不需要像我在开始时所做的那样,你会在第一个大型重构之后改变主意。

  2. 消除回调地狱:保持性能至关重要(如上所述)但消除回调代码。使用async / await编写线性代码并保持异步性。与承诺相结合,但比单独使用承诺要好得多。

  3. 工具:很多选项,但我发现最好的是Typescript(今天的ES6 / 7),VS Code(intellisense),Mocha(单元测试)。

    < / LI>
  4. 工具/日志记录:通过跟踪和工具深入了解您的应用非常重要。

  5. 以经过深思熟虑的框架为基础:我使用快递作为例子,但这是一种偏好,还有其他的。

答案 1 :(得分:17)

Node.js是构建分布式网络服务的非常好的工具。您的大规模应用程序设计不仅仅是“使用哪种工具”的问题。很多人以非常异构的方式使用node.js以及ruby,php,erlang,apache&amp; nginx&amp; HAProxy的。如果您不知道为什么需要节点,则可能不需要它。考虑节点的可能原因:

  • 您想在服务器和客户端之间共享通用的Javascript代码
  • 您期望高度并发加载(每台服务器同时连接数千到数十万)
  • 您(或您的团队)使用JavaScript比使用任何其他可用语言/框架更精通
  • 如果one of 7600+ modules正在实施大部分所需功能

答案 2 :(得分:12)

NodeJS的一个“问题”是构建一个大型应用程序需要开发人员/团队的纪律。

同一家公司内的多个团队尤其如此。现有的框架有点松散,不同的团队会提出不同的方法来解决问题。

KrakenJS是一个建立在快递之上的框架。它增加了一层约定和配置,使得构建大型项目变得容易(呃),涉及多个团队。

答案 3 :(得分:9)

真的NodeJs以自己的方式强大,更多信息,

  1. 您可以在负载均衡下运行多个应用实例来处理大量请求。
  2. 选择NodeJs来读取2000个文件,而不是计算第20个素数。
  3. 让NodeJ忙于读/写文件或端口。
  4. 当您需要向多个客户广播您的回复时非常有用。
  5. 不关心NodeJ中的死锁,但要注意你做同样操作的频率。
  6. 最重要的是,这些值存在于V8引擎中,直到进程终止。确保在NodeJ中提供多少代码行。

答案 4 :(得分:2)

我发现最重要的是尽可能少地使用CPU时间。如果您的应用程序需要密集使用CPU,则事件循环延迟会增加,应用程序将无法响应任何其他请求。

答案 5 :(得分:0)

据我所知,最大的不同是原始速度和异步等待。 对于 Javascript 中等水平,特别了解 REST 以及上述方面的人来说,node.js 是大型企业应用程序的最佳解决方案之一。 如果我错了,请纠正我,但如果团队就要遵循的某些约定和标准达成一致,即使使用原始 express(没有构建在它之上的那些框架)实际上也足够了。