为什么node.js不适合大型项目


Posted in Javascript onApril 28, 2021

前言

首先要明确什么是大型应用,其实这是仁者见仁、智者见智的问题,并且它是一个哲学问题,不是一个技术问题。假如有人问你,一个可以进行线上销售的网站,比如优衣库,大不大?你可能会说大,因为这与你平常所见的博客、企业官网等逻辑相比较确实复杂很多。或者说小,那么说明你开发过比它还复杂的系统。那么相比较淘宝而言呢?大和小的对比是要有参照物的。

1. 应用的组成

一个完备的 Web 应用可能只由一门语言或者一种技术构成吗?不可能。因为一个完备的 Web 应用其实是多门技术的综合体,解决某个问题有非常多的解决方案,比如后端的逻辑解决方案就非常多,Java、php、Python、Ruby 等都可以。

简单地概述,应用的组成内容可能包括:

Web 界面显示逻辑;后端业务逻辑;缓存;数据库;消息队列。

其实还可以加入日志分析、数据分析等,只是上面几个最广为人知而已。

2. 应用的种类

I/O 密集型;CPU 密集型。

就常见的互联网产品而言,它的瓶颈并非在后端业务的逻辑上,而是在 I/O 上,即返回给用户看的数据的读入与输出。相对于应用程序而言,读入指的是从数据库里获取数据,而输出指的是将这些数据经过一定的处理输出到用户的浏览器,那么这就是 I/O 密集型。

而CPU密集型是指做频繁计算任务的应用,Node.js在这方面确实是短板。

3. 应用服务的过程

如图所示,用户通过浏览器发送请求,由网卡接收TCP 连接,通知内核,内核再去调用相对应的服务端程序。

Request 请求过程

为什么node.js不适合大型项目

Response 返回过程

如下图,Web 应用要返回数据,首先要获取数据,通过内核调用磁盘的驱动程序,把数据读入缓存,这样就可以在 Web 应用程序中获取数据并进行数据处理,最终调用内核,将数据通过网卡发送给客户端。

为什么node.js不适合大型项目

4. 应用的瓶颈

通常 I/O 密集型的瓶颈会在磁盘的读写上,所以在购买云服务器的时候可以购买 SSD 的磁盘来提升性能,一般数据库软件的数据都是存储在文件上面的。首先考虑添加内存型缓存来解决这个瓶颈,缓存经常访问的数据,看能否解决当前场景的问题,比如使用 Redis。其次才考虑搭建或扩充数据库集群来提高并发。

而 CPU 密集型的应用瓶颈则在 CPU 上,只能增加 CPU 处理核心来解决瓶颈。

5. 分布式应用

大型的普通应用与分布式应用其实是不同的概念。读者可以把分布式应用简单地理解为一个团队,每一个成员都是一个节点,一个大的项目要让成员合作完成,那么成员与成员之间就存在一些沟通成本,甚至有的成员与成员之间勾心斗角,说话阳奉阴违、推脱责任,也有可能成员生病在家休养,无法工作,等等。在面对这些问题的时候,Node.js的优势并不能很好地显现出来(并非不可以做,只是没有完善的基础设施)。

分布式的真正定义是,在多台不同的服务器中部署不同的服务模块,以进程为基本单位,派发到服务器上,通过远程调用(RPC)通信并协同工作,最终对外提供服务。

相比较Node.js目前的分布式基础设施,Go 语言的基础设施则完善多了,特别是在 Docker 这个项目上,充分证明了 Go 语言的优势,这也是为什么 Node.js 社区“大牛”TJ Holowaychuk 转向 Go 语言,因为他要开发分布式应用。

其实没必要过分地关心分布式的问题,毕竟JavaScript最初只是一个运行在浏览器端的脚本语言而已,JavaScript不是万能的,为什么一定要把它用在操作系统级别的开发上呢?寻找一个更合适的语言不是更好吗?就像此刻我们选择 JavaScript 构建 Web 应用一样。

6. 多进程的 Node.js

了解了以上的一些知识点,现在读者应该知道,Node.js 跟大型应用关系不大。大多数学习 Node.js 的开发者是前端开发者,所以对后端的基础知识并不了解,在网络上搜寻一些资料的时候发现 Node.js 只能利用单核,而又听说 TJ Holowaychuk 转向 Go 的阵营,所以有的开发者就产生了Node.js不适合开发大型应用的疑问。

Node.js 只能利用单核的问题已经被解决了,后面使用的 Egg.js框架中的 Egg-Cluster 模块就利用多进程非常好地解决了这个问题。

以上就是为什么node.js不适合大型项目的详细内容,更多关于node.js的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
IE6、IE7中获取Button元素的值的bug说明
Aug 28 Javascript
AngualrJS中每次$http请求时的一个遮罩层Directive
Jan 26 Javascript
第四篇Bootstrap网格系统偏移列和嵌套列
Jun 21 Javascript
JS提示:Uncaught SyntaxError: Unexpected token ILLEGAL错误的解决方法
Aug 19 Javascript
jQuery序列化表单成对象的简单实现
Nov 29 Javascript
纯js实现倒计时功能
Jan 06 Javascript
jQuery基本选择器和层次选择器学习使用
Feb 27 Javascript
Underscore之Array_动力节点Java学院整理
Jul 10 Javascript
JavaScript中关于base64的一些事
May 06 Javascript
JS学习笔记之闭包小案例分析
May 29 Javascript
在vue中使用axios实现post方式获取二进制流下载文件(实例代码)
Dec 16 Javascript
基于JavaScript实现省市联动效果
Jun 22 Javascript
JavaScript控制台的更多功能
Apr 28 #Javascript
JavaScript使用canvas绘制坐标和线
JS Object构造函数之Object.freeze
Apr 28 #Javascript
关于vue中如何监听数组变化
vue实现简单数据双向绑定
Apr 28 #Vue.js
JS异步堆栈追踪之为什么await胜过Promise
Apr 28 #Javascript
vue引入Excel表格插件的方法
Apr 28 #Vue.js
You might like
php时间戳转换的示例
2014/03/31 PHP
使用 PHPStorm 开发 Laravel
2015/03/24 PHP
PHP实现微信图片上传到服务器的方法示例
2017/06/29 PHP
PHP实现二叉树深度优先遍历(前序、中序、后序)和广度优先遍历(层次)实例详解
2018/04/20 PHP
10款非常有用的 Ajax 插件分享
2012/03/14 Javascript
Javascript 闭包引起的IE内存泄露分析
2012/05/23 Javascript
将input file的选择的文件清空的两种解决方案
2013/10/21 Javascript
jQuery实现表格展开与折叠的方法
2015/05/04 Javascript
JavaScript操作select元素和option的实例代码
2016/01/29 Javascript
AngularJS入门教程之过滤器详解
2016/08/19 Javascript
JSONP基础知识详解
2017/03/19 Javascript
bootstrap警告框示例代码分享
2017/05/17 Javascript
基于vue.js无缝滚动效果
2018/01/25 Javascript
微信小程序实现图片预览功能
2018/01/31 Javascript
vue+webpack实现异步加载三种用法示例详解
2018/04/24 Javascript
jQuery中ajax请求后台返回json数据并渲染HTML的方法
2018/08/08 jQuery
fastadmin中调用js的方法
2019/05/14 Javascript
vue分页插件的使用方法
2019/12/25 Javascript
node.JS事件机制与events事件模块的使用方法详解
2020/02/06 Javascript
解决vue单页面 回退页面 keeplive 缓存问题
2020/07/22 Javascript
关于vue 结合原生js 解决echarts resize问题
2020/07/26 Javascript
ant design中upload组件上传大文件,显示进度条进度的实例
2020/10/29 Javascript
使用js获取身份证年龄的示例代码
2020/12/11 Javascript
vue登录页实现使用cookie记住7天密码功能的方法
2021/02/18 Vue.js
python使用cookielib库示例分享
2014/03/03 Python
详解Python中的变量及其命名和打印
2016/03/11 Python
python读取和保存视频文件
2018/04/16 Python
Python寻找两个有序数组的中位数实例详解
2018/12/05 Python
Python3爬虫学习之爬虫利器Beautiful Soup用法分析
2018/12/12 Python
python粘包问题及socket套接字编程详解
2019/06/29 Python
python图像处理模块Pillow的学习详解
2019/10/09 Python
全国道德模范事迹
2014/02/01 职场文书
2014年企业党建工作总结
2014/12/18 职场文书
网络舆情信息简报
2015/07/21 职场文书
煤矿安全学习心得体会
2016/01/18 职场文书
拙作再改《我的收音机情缘》
2022/04/05 无线电