为什么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 相关文章推荐
Js 获取HTML DOM节点元素的方法小结
Apr 24 Javascript
img onload事件绑定各浏览器均可执行
Dec 19 Javascript
判断是否安装flash player及当前版本的JS代码
Aug 08 Javascript
js转义字符介绍
Nov 05 Javascript
使用apply方法实现javascript中的对象继承
Dec 16 Javascript
jQuery使用append在html元素后同时添加多项内容的方法
Mar 26 Javascript
jquery插件splitScren实现页面分屏切换模板特效
Jun 16 Javascript
jQuery垂直多级导航菜单代码分享
Aug 18 Javascript
js立即执行函数: (function ( ){})( ) 与 (function ( ){}( )) 有什么区别?
Nov 18 Javascript
jquery使用iscorll实现上拉、下拉加载刷新
Oct 26 jQuery
JavaScript面向对象的程序设计(犯迷糊的小羊)
May 27 Javascript
图片文字识别(OCR)插件Ocrad.js教程
Nov 26 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内部实现打乱字符串顺序函数str_shuffle的方法
2019/02/14 PHP
PHP fclose函数用法总结
2019/02/15 PHP
游戏人文件夹程序 ver 4.03
2006/07/14 Javascript
如何实现iframe(嵌入式帧)的自适应高度
2006/07/26 Javascript
基于jQuery图片平滑连续滚动插件
2009/04/27 Javascript
JavaScript 常用函数
2009/12/30 Javascript
jquery默认校验规则整理
2014/03/24 Javascript
jQuery跨域问题解决方案
2015/08/03 Javascript
jQuery stop()用法实例详解
2016/07/28 Javascript
JavaScript DOM节点操作方法总结
2016/08/23 Javascript
jQuery插件实现可输入和自动匹配的下拉框
2016/10/24 Javascript
AngularJS 应用身份认证的技巧总结
2016/11/07 Javascript
关于Bootstrap按钮组件消除黄框的方法
2017/05/19 Javascript
vue实现2048小游戏功能思路详解
2018/05/09 Javascript
JavaScript实现淘宝京东6位数字支付密码效果
2018/08/18 Javascript
微信小程序实现多选框全选与反全选及购物车中删除选中的商品功能
2019/12/17 Javascript
vue 判断元素内容是否超过宽度的方式
2020/07/29 Javascript
微信小程序实现音乐播放页面布局
2020/12/11 Javascript
python计算时间差的方法
2015/05/20 Python
解决python升级引起的pip执行错误的问题
2018/06/12 Python
pycharm下查看python的变量类型和变量内容的方法
2018/06/26 Python
Sanic框架Cookies操作示例
2018/07/17 Python
对python判断是否回文数的实例详解
2019/02/08 Python
python字符串的index和find的区别详解
2020/06/20 Python
HTML5+CSS3实例 :canvas 模拟实现电子彩票刮刮乐代码
2016/12/30 HTML / CSS
压铸汽车模型收藏家:Diecastmodelswholesale.com
2016/12/21 全球购物
有750多个顶级品牌的瑞士时尚在线:ABOUT YOU
2017/01/04 全球购物
Electric官网:美国高级眼镜和配件品牌
2020/06/04 全球购物
荷兰DOD药房中文官网:DeOnlineDrogist
2020/12/27 全球购物
入党申请自荐书范文
2014/02/11 职场文书
志愿者宣传口号
2014/06/17 职场文书
2014年德育工作总结
2014/11/20 职场文书
2015年勤工助学工作总结
2015/04/29 职场文书
2015党建工作简报
2015/07/21 职场文书
2016年中秋祝酒词
2015/11/26 职场文书
海贼王十大逆天果实 魂魂果实上榜,岩浆果实攻击力最强
2022/03/18 日漫