为什么node不适合大型项目?

更新日期: 2020-02-25阅读: 1.9k标签: 项目

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


1. 应用的组成

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

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

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

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


2. 应用的种类

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

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

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


3. 应用服务的过程

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

Request 请求过程


Response 返回过程

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



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 模块就利用多进程非常好地解决了这个问题。


链接: https://www.fly63.com/article/detial/7699

程序员最喜欢什么样的项目经理?

在当今的专业环境中,项目经理需要戴上各种帽子,在管理团队的日常功能和理解大局策略之间切换。正因为如此,项目经理对组织变得更有价值,并且他们对技能和战略角色的需求在全球范围内不断增长。但这也提出了一个问题:如何在如此高压的环境中成为更好的项目经理?

原生JS实现随机点名项目

随机产生规定范围内的整数,然后再产生相同范围内的整数,两者相同时,则暂停。所用知识:Math.random() * num: 产生从0到num的随机数,Math.floor(): 向下取整,简单的DOM操作等

没有项目经验找工作处处碰壁怎么办?

我马上就要毕业了没有开发经验怎么办?我投递了 N 多公司全部没有给工作机会,有的给了面试机会也是没有下文了怎么办?我简历上什么东西都没有,要不要伪造一个工作经历呢?

当了项目经理才明白的10件事!

项目经理这个神奇的职位,改变了我很多工作处事的方式,从前性情纯真的耿直boy,现在变成了人鬼皆爱的老油条, 以下是我当了项目经理之后明白的10件事, 如有雷同,真是太巧。

pm2 快速部署前端项目

pm2 大家应该都知道,主要是用来管理 node 进程,但是同样可以用来部署前端代码。也可以手动添加 public key 到服务器上的 ~/.ssh/authorized_keys,

关于小型长周期项目的一些建议

我不是专业的项目经理,这里不讨论大型项目管理的事情。我们比较常遇到的可能是小型的长周期项目,比如2-4个人,做半年甚至一年的项目。这种项目通常不会有专职的项目经理

水印项目的实现以及两种实现方案的选优

通过 attachShadow 这个方法生成一个shadow root 即shadow的根节点,然后在这个根节点下面通过循环语句添加水印,利用position为absolute进行排版,使其铺满容器

重构项目,你真的准备好了吗?

我相信每个接受过老项目的程序员可能都吐槽过“前人的代码都是屎”。一个已经有些年头的项目,几乎肯定可以看到——到处拷贝来拷贝去的代码,随处可见的拼写错误,头重脚轻的函数……

浅谈RPC

近几年随着微服务化项目的崛起,逐渐成为许多公司中大型分布式系统架构的主流方式,而今天所说的 RPC 在这其中扮演着至关重要的角色。随着这段日子公司项目微服务化的演进,发现在日常开发中都在隐式或显式的使用 RPC

在Vue项目中使用Eslint+Prettier+Stylelint

首先搭建vue项目,lint选择ESLint + Prettier,配置方式选择In dedicated config files。具体搭建过程这里就不赘述了,如果不熟悉的同学可以点击这里。配置 Stylelint,目前还没有stylelint选项,需要我们自己安装相关的 npm 包

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!