cluster模块 = net + child_process 组合应用
进程管理
最初的node多进程模型/抢占式:
发送fd给所有worker: master通过执行cluster.fork(),fork出多个worker进程,worker执行listen()。进程间通过传递文件描述符fd完成通信,由于多个worker间存在竞争问题导致惊群现象。
改进/Round-Robin:
不直接将fd分发给所有worker:master创建socket,绑定端口,执行listen(),通过round-robin等算法挑选一个worker,将拿到的链接客户端句柄fd直接交给该子进程。从而避免惊群,实现负载均衡。
进程管理要考虑的几个关键点:
负载均衡 –> 如何利用多核cpu: 抢占式,Round-Robin算法
进程守护 –> reload,子进程exit或disconnect时,父进程重新fork一个子进程
优雅退出 –> 捕获到uncaughtException错误,通知master进行fork,断开已有链接且不接受新链接,处理完已有请求,断开数据库等连接,一段时间后主动kill自己
进程通信
1 | 实现进程通信 --> IPC通道 |
具体实现:fork()时,父进程先构造一个IPC通道并监听,父进程创建子进程,并通过环境变量告诉子进程该通道的fd,子进程启动时根据fd去连接这个已存在的通道,此后就可以双向通信了