【问题标题】:Using NodeJS for a big project [closed]将 NodeJS 用于大型项目 [关闭]
【发布时间】:2021-07-13 14:05:45
【问题描述】:

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

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

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

我有什么遗漏吗? NodeJS 真的那么强大吗?

【问题讨论】:

  • 在实际项目上工作了一段时间后,我用最新发现更新了我的答案。

标签: javascript node.js


【解决方案1】:

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

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

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

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

我创建了这个项目作为说明大多数要点的示例 - Sane Node Developmenthttps://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 存储库以查看它是否正在积极维护(或者是否有一堆问题从未引起注意)。

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

  1. 编译时支持(和智能感知):在编译时发现问题。如果您认为自己不像我刚开始时那样需要它,那么在第一次大重构之后您就会改变主意。

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

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

  4. 仪器/日志记录:通过跟踪和仪器深入了解您的应用至关重要。

  5. 建立在经过严格审查的框架上:我以 express 为例,但这是一种偏好,还有其他偏好。

【讨论】:

  • 这些都是非常好的观点,但问题是:NodeJS 是大型服务器端应用程序的好框架/代码库吗?。这没有回答问题。
  • @Maroshii - 这是一个非常主观和模棱两可的问题 - 我建议仅基于该问题关闭。但是,他们列出了为什么它可能不可接受的具体点,我解决了这些点。
  • // 如果它正在积极维护中(或者是否有一堆问题从未引起注意)。这部分真的很可怕:/,如果该工具的维护将来停止会发生什么:/
  • 我想说的是,大型项目/大型服务器端应用程序在大多数情况下总是会涉及更多的 API 端点,因此 NodeJS 将不够或不会如果您只想在后端使用单一语言堆栈,这是正确的选择
  • Node Js 不适合大型计算项目。因为它是单线程的。
【解决方案2】:

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

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

【讨论】:

  • +1 - 特别是共享服务器和客户端代码。在浏览器客户端和服务器(REST API 等)之间共享 JavaScript 库(例如验证)非常有吸引力
  • 同意@bryanmac。为单页应用共享 html 模板也很棒。
【解决方案3】:

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

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

KrakenJS 是一个框架,建立在 express 之上。它增加了一层约定和配置,应该可以更容易(呃)构建涉及多个团队的大型项目。

【讨论】:

    【解决方案4】:

    NodeJs 确实有它自己的强大功能,更多信息,

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

      • 其实是的,速度很快,但不适合大量计算。
      【解决方案6】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-05-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-11
        • 1970-01-01
        • 2013-09-10
        相关资源
        最近更新 更多