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

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


本文选自《Node.js实战:使用Egg.js+Vue.js+Docker构建渐进式、可持续集成与交付应用》,作者yugo,电子工业出版社9月出版。

了解本书详情:https://u.jd.com/e29Uft

为什么经常说Node.js不适合大型应用相关推荐

  1. 下载基于LigerUI+JBPM5自定义表单+Node.js的J2EE大型金融项目《财务预算系统》

    基于LigerUI+JBPM5自定义表单+Node.js的J2EE大型金融项目<财务预算系统>开发全程实录 地址:http://pan.baidu.com/s/1c3zLGZ2 密码:e7 ...

  2. 基于LigerUI+JBPM5自定义表单+Node.js的J2EE大型金融项目《财务预算系统》开发全程实录

    课程简介:本课程系讲师在实际金融行业工作中的一真实项目,除简化了部分业务逻辑外,基础架构及核心模块超均来自企业项目. 通过本课程的学习,学员不但能迅速掌握Java开发中所需的必要的技术,更能掌握金融行 ...

  3. [知乎回答] 前端是否要学习 Node.js?

    大家好,我是若川.最近组织了源码共读活动,感兴趣的可以加我微信 ruochuan12很多小伙伴都表示收获颇丰.一起学的大多数200行左右的Node.js源码.今天推荐这篇文章.(刚刚在写明天掘金要发的 ...

  4. 如何决定何时使用Node.js?

    已锁定 . 该问题及其答案被锁定,因为该问题是题外话,但具有历史意义. 它目前不接受新的答案或互动. 了解更多 . 我对这种东西是陌生的,但是最近我已经听到很多关于Node.js有多出色的信息. 考虑 ...

  5. 性能追击:万字长文30+图揭秘8大主流服务器程序线程模型 | Node.js,Apache,Nginx,Netty,Redis,Tomcat,MySQL,Zuul

    本文为<高性能网络编程游记>的第六篇"性能追击:万字长文30+图揭秘8大主流服务器程序线程模型". 最近拍的照片比较少,不知道配什么图好,于是自己画了一个,凑合着用,让 ...

  6. Node.JS的魔力与神话

    In May 2020, Node.JS turned 11 years old. 2020年5月,Node.JS才11岁. Since its inception, this programming ...

  7. Node.js VS Python:孰优孰劣?

    转载自品略图书馆 http://www.pinlue.com/article/2020/07/2814/1111088479253.html 导读:人们可能会在Node.js和Python之间选择时感 ...

  8. 企业最佳Node.js 应用案例分享

    微软.IBM.思科.Netflix.PayPal--这些只是少数几家在产品中使用Node.js软件的顶尖公司.自2009年首次发布以来,JavaScript环境越来越受欢迎.为什么呢?这是因为Node ...

  9. node.js入门系列(一)--Node.js简介

    什么是NodeJS JS是脚本语言,脚本语言都需要一个解析器才能运行.对于写在HTML页面里的JS,浏览器充当了解析器的角色.而对于需要独立运行的JS,NodeJS就是一个解析器. 每一种解析器都是一 ...

  10. 你不知道的Node.js性能优化,读了之后水平直线上升

    本文由云+社区发表 "当我第一次知道要这篇文章的时候,其实我是拒绝的,因为我觉得,你不能叫我写马上就写,我要有干货才行,写一些老生常谈的然后加上好多特技,那个 Node.js 性能啊好像 D ...

最新文章

  1. 双绞线是计算机网络的一种通信线路吗,计算机网络环境的信道传输技术分析
  2. 使用Flex4容器若干技巧
  3. delphi 数字识别_基于STM32单片机的车牌识别
  4. Nginx服务器之基础学习
  5. Python之web开发(四):python使用django框架搭建网站之主页搭建
  6. web service接口_win7 添加环回网卡+H3C 模拟器 防火墙开启Web功能
  7. 用 PHPRPC 实现 Ajax 安全登录
  8. redis 远程主机强迫关闭了一个现有的连接_如何在 Debian 10 上安装和配置 Redis 服务...
  9. android9.0变化,十年巨变 Android 1.0对比Android 9
  10. 零基础简单易用的EmberJS框架
  11. 读 Irving M. Copi 之《逻辑学导论》
  12. uni-app真机运行app时报错:TypeError: Cannot read property ‘call’ of undefined
  13. vue酒店房间管理系统
  14. 关于tp-link 路由器
  15. sklearn.svm.SVC的方法decision_function_shape:ovr 或者 ovo
  16. html403禁止访问怎么解决,http403禁止访问错误产生的原因以及解决办法
  17. python统计汉字个数是_python统计中文字符数量的两种方法
  18. Cannot create an instance of class AndroidViewModel (androidx ViewModelProvider AndroidViewModel)
  19. android 为摄像头增加闪光灯(s5pv210)
  20. c语言程序设计 doc,C语言程序设计61844.doc

热门文章

  1. Phoenix 映射 HBase + Maven
  2. spring-data-jpa动态条件查询
  3. Windows和linux(ubuntu)互传文件简便快捷的方法
  4. MiluGPS(迷路者GPS导航软件)
  5. SVN客户端下载和Svn visual studio插件
  6. kafka 消费者offset记录位置和方式
  7. win7下cmd常用命令
  8. 【android 开 发 】 - Android studio 下 NDK Jni 开发 简单例子
  9. jupyter 代码到 pycharm 的迁移
  10. IJCAI2021论文:MEDA:一种为小样本文本分类设计的结合数据增强的元学习框架