将NodeJS用于大型项目

Using NodeJS for a big project

本文关键字:大型项目 用于 NodeJS      更新时间:2023-09-26

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

根据我在网上读到的内容,NodeJS并不是大型程序的最佳工具。我遇到的情况如下:

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

我有什么东西不见了吗?NodeJS真的有那么强大吗?

NodeJS对于大型服务器端应用程序来说是一个好的框架/代码库吗?

这个问题有点主观,但我包含了实际的客观点,这些点在处理大型项目中的节点时可以解决实际问题。

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

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

我创建了这个项目作为一个示例,说明了大多数要点-Sane节点开发:https://github.com/bryanmacfarlane/sanenode

NodeJS不是在自己的http服务器上构建的。它构建在V8 chrome javascript引擎之上,并且不假定有http服务器。有一个内置的http模块和流行的express web服务器,但也有socket模块(以及socket.io)。它不仅仅是一个http服务器。

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

至于软件模块,您可以在npm注册表中进行搜索。始终查看有多少其他人使用它(下载),并访问github回购,看看它是否得到了积极维护(或者是否存在一系列从未引起关注的问题)。

关于"大项目",我发现对正常开发至关重要的是:

  1. 编译时支持(和intellisense):在编译时查找问题。如果你认为你不像我刚开始的时候那样需要这个,那么在第一次大规模重构之后,你就会改变主意。

  2. 消除回调地狱:保持关键性能(如上所述),但消除回调代码。使用async/await编写线性代码并保持async-perf。与promise集成,但比仅使用promise要好得多。

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

  4. 检测/日志:通过跟踪和检测深入了解您的应用程序至关重要。

  5. 构建在经过充分审查的框架上:我使用express作为示例,但这是一种偏好,还有其他一些。

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

  • 您希望在服务器和客户端之间共享通用的Javascript代码
  • 您期望高并发负载(每个服务器同时连接数千到数十万个)
  • 你(或你的团队)比任何其他可用的语言/框架都更精通JavaScript
  • 如果7600多个模块中的一个正在实现所需功能的大部分

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

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

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

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

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

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

到目前为止,原始速度和异步等待是最大的区别。对于那些熟练掌握Javascript并特别了解REST以及上述方面的人来说,node.js是大型企业应用程序的最佳解决方案之一。如果我错了,请纠正我,但如果团队就要遵循的某些惯例和标准达成一致,即使使用原始express(没有构建在其之上的框架)实际上也足够好了。