20200813

@czhang
  • date: 20200813
  • author: czhang

Plan

node 多 进程

Notes

句柄传递

  • 如果使用的一个主代理进程做代理,其他进程处理数据,会在创建和连接的时候,浪费操作系统有限的文件描述符
  • send() 第二个参数是句柄 句柄
  • 实际传输过程中,将对象 Stringify 传输,拿到结果先过滤后 parse ,因此会觉得是传输了一个对象
  • node 底层对每个端口监听设置了 SO_REUSEADDR 选项,独立启动的进行不知道文件描述符,因此会失败,send 发送的句柄还原出来的文件描述符是相同的,因此不会异常

集群稳定

  1. 进程事件

    • send

    • message

    • error

    • exit

    • close

    • disconnect

    • 还能通过 kill 给进程 发送信息

  2. 自动重启

    • 主进生成子进程时,记录子进程的 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();
        });
    }
    
      1. 自杀信号
      • 添加 进程监听到异常,停止接受新的连接,当已有连接断开后,退出进程
      • 问题:停止的过程中,可能新的请求可能没有新的工作进程为之服务
      • 解决方案: 在开始停止接受连接的时候,向主进程发送自杀消息,主进程拿到消息后,立马创建新的进程
      • 问题:长连接等待断开的时间可能很久
      • 解决方案: send 自杀信号 5 秒后,强制退出进程
      1. 限量重启
      • 工作进程不能无限制的重启
      • 创建一个队列,记录当前时间,每次启动的时候进入队列,拿出前多少次的进行对比,查看距离上次启动时间是否过于短
  3. 负载均衡

    • 以前: 抢占式
    • 现在: (i+1) mod n
  4. 状态共享

    • node 进程中不宜存放太多数据,会加重垃圾回收负担
    • node 不允许多进程之间共享数据
    • 使用第三方数据存储/主动同志的方式状态共享

More