20200813
- date: 20200813
- author: czhang
Plan
node 多 进程
Notes
句柄传递
- 如果使用的一个主代理进程做代理,其他进程处理数据,会在创建和连接的时候,浪费操作系统有限的文件描述符
- send() 第二个参数是句柄 句柄
- 实际传输过程中,将对象 Stringify 传输,拿到结果先过滤后 parse ,因此会觉得是传输了一个对象
- node 底层对每个端口监听设置了 SO_REUSEADDR 选项,独立启动的进行不知道文件描述符,因此会失败,send 发送的句柄还原出来的文件描述符是相同的,因此不会异常
集群稳定
进程事件
send
message
error
exit
close
disconnect
还能通过 kill 给进程 发送信息
自动重启
- 主进生成子进程时,记录子进程的 pid 及状态,在子进程中添加监听退出后新建一个子进程
function createWorker() { const s = fork('./sub.js'); s.send('server', p); worker[s.pid] = s; console.log('sub created' + s.pid); s.on('exit', function (res) { console.log('sub ' + s.pid + 'exit'); delete worker[s.pid]; createWorker(); }); }- 自杀信号
- 添加 进程监听到异常,停止接受新的连接,当已有连接断开后,退出进程
- 问题:停止的过程中,可能新的请求可能没有新的工作进程为之服务
- 解决方案: 在开始停止接受连接的时候,向主进程发送自杀消息,主进程拿到消息后,立马创建新的进程
- 问题:长连接等待断开的时间可能很久
- 解决方案: send 自杀信号 5 秒后,强制退出进程
- 限量重启
- 工作进程不能无限制的重启
- 创建一个队列,记录当前时间,每次启动的时候进入队列,拿出前多少次的进行对比,查看距离上次启动时间是否过于短
负载均衡
- 以前: 抢占式
- 现在: (i+1) mod n
状态共享
- node 进程中不宜存放太多数据,会加重垃圾回收负担
- node 不允许多进程之间共享数据
- 使用第三方数据存储/主动同志的方式状态共享