NodeJS技能树!

从《深入浅出NodeJS》总结的技能树

_config.yml

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.dataobj.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中非常简单,只需要变更项目启动方式,如下图: _config.yml 平时本地调试跑单进程npm run dev
部署测试环境/生产环境用npm run start
egg-scrpits命令就包含了如何使用启用集群的方式运行多个node环境
--daemon表示开启守护进程
_config.yml

可以在本地验证,运行npm run start,以8核CPU为例,一共开启了9个node进程,其中1个Master,8个Worker。如果手动关闭一个进程,守护进程马上自动又开启一个。可以使用npm run stop正常关闭。

6. Buffer

堆外内存

大文件读写

Written on August 24, 2018