为什么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 相关文章推荐
JavaScript 命名空间 使用介绍
Aug 29 Javascript
解决jquery插件冲突的问题
Jan 23 Javascript
javascript字母大小写转换的4个函数详解
May 09 Javascript
js判断元素是否隐藏的方法
Jun 09 Javascript
js实现单击图片放大图片的方法
Feb 17 Javascript
JavaScript使用pop方法移除数组最后一个元素用法实例
Apr 06 Javascript
Javascript基础_标记文字的实现方法
Jun 14 Javascript
浅谈Javascript中的12种DOM节点类型
Aug 19 Javascript
JS中位置与大小的获取方法
Nov 22 Javascript
基于JQuery实现的跑马灯效果(文字无缝向上翻动)
Dec 02 Javascript
实例详解vue中的$root和$parent
Apr 29 Javascript
JS面向对象编程基础篇(三) 继承操作实例详解
Mar 03 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
BBS(php & mysql)完整版(三)
2006/10/09 PHP
由php if 想到的些问题
2008/03/22 PHP
PHP多进程编程之僵尸进程问题的理解
2017/10/15 PHP
jQuery温习篇 强大的JQuery选择器
2010/04/24 Javascript
JQuery中$之选择器用法介绍
2011/04/05 Javascript
学习从实践开始之jQuery插件开发 菜单插件开发
2012/05/03 Javascript
node.js中的buffer.write方法使用说明
2014/12/10 Javascript
.NET微信公众号开发之创建自定义菜单
2015/07/16 Javascript
js+css实现超简洁的二级下拉菜单效果代码
2015/09/07 Javascript
JavaScript程序设计之JS调试
2015/12/09 Javascript
vue.js指令v-for使用及索引获取
2016/11/03 Javascript
微信小程序 合法域名校验出错详解及解决办法
2017/03/09 Javascript
backbone简介_动力节点Java学院整理
2017/07/14 Javascript
Vue 组件修改根实例的数据的方法
2019/04/02 Javascript
基于Vue+elementUI实现动态表单的校验功能(根据条件动态切换校验格式)
2019/04/04 Javascript
Vue中用JSON实现刷新界面不影响倒计时
2020/10/26 Javascript
[54:08]LGD女子刀塔学院 DOTA2炼金术士教学
2014/01/09 DOTA
python中字典dict常用操作方法实例总结
2015/04/04 Python
我用Python抓取了7000 多本电子书案例详解
2019/03/25 Python
Python中的self用法详解
2019/08/06 Python
python3 写一个WAV音频文件播放器的代码
2019/09/27 Python
Python完全识别验证码自动登录实例详解
2019/11/24 Python
Python爬虫获取豆瓣电影并写入excel
2020/07/31 Python
基于Python实现天天酷跑功能
2021/01/06 Python
python中封包建立过程实例
2021/02/18 Python
html5+css3气泡组件的实现
2014/11/21 HTML / CSS
Dr. Martens马汀博士官网:马丁靴始祖品牌
2016/10/15 全球购物
服装店营销方案
2014/03/10 职场文书
本科毕业生自荐信
2014/05/26 职场文书
班子群众路线教育实践个人对照检查材料思想汇报
2014/09/30 职场文书
赢在执行观后感
2015/06/16 职场文书
护理工作心得体会
2016/01/22 职场文书
《静夜思》教学反思
2016/02/17 职场文书
如何把新闻人物写得立体、鲜活?
2019/08/14 职场文书
OpenStack虚拟机快照和增量备份实现方法
2022/04/04 Servers
Win11任务栏无法正常显示 资源管理器不停重启的解决方法
2022/07/07 数码科技