NodeJS技能树!
从《深入浅出NodeJS》总结的技能树
NodeJS是运行环境,实际的编程语言是javascript,请不要认为会写几句javascript就说会NodeJS,哈哈。
1. 事件驱动、非阻塞
2. 模块机制
分类:核心模块(内置/C/C++扩展),路径引用模块(./xx.js或.json文件),自定义(npm install安装) 加载方式:优先缓存
3. 异步
非阻塞IO模型(生产者消费者)
microTask: promise>nextTick
macroTask: setTimeout>setImmediate
循环: 先按顺序执行事件队列所有微任务,promise优先于nextTick,再执行队列队首一个宏任务,再执行此时的所有微任务(在上一次微任务之后在此期间的微任务列表),如此循环。
4. 内存控制
内存泄漏
表现:闭包内外相互依赖,无法回收;全局变量数据没有及时清理;
优化:合理的作用域,优先考虑局部变量而不是全局变量;主动释放,delete obj.data
或obj.data = null
;二进制大文件使用Buffer读写;
监控:heapdump,需要安装python2.7版本环境,gyp模块,C++特定版本的编译环境(由于C++没装成功,导致没实际操作过)
5. 进程
多进程架构
child_process内置模块,通过Master复制(fork)多个worker。 实际中一般是通过child_process fork出一个agent,agent中做多个worker的公共业务,如日志。通过Master复制(fork)多个副本(worker)。
稳定性:Master>Agent>Worker
包含的业务逻辑:Worker>Agent>Master
进程间通信
在主进程注册并监听message事件,在子进程内send消息。
Cluster集群
NodeJS中已经有了封装好的require(‘cluster’)模块,底层实现如上述,可以设置同时fork几个进程,开启后默认不设置的话是require(‘os’).cpus().length个。
集群在Express中应用时需要在创建服务createServer时配置,在EggJS中非常简单,只需要变更项目启动方式,如下图:
平时本地调试跑单进程
npm run dev
部署测试环境/生产环境用npm run start
egg-scrpits
命令就包含了如何使用启用集群的方式运行多个node环境
--daemon
表示开启守护进程
可以在本地验证,运行npm run start
,以8核CPU为例,一共开启了9个node进程,其中1个Master,8个Worker。如果手动关闭一个进程,守护进程马上自动又开启一个。可以使用npm run stop
正常关闭。