cluster 模块的工作的结构很简单。我们创建一个 主进程并且主进程衍生(fork)了一些工作进程(worker process),然后管理它们。每一个工作进程代理表了一个我们想要扩展的应用的一个实例。所有到来的请求都被主进程所处理,它决定着哪一个工作进程应该处理一个到来的请求。

    主进程的工作很简单,因为它实际上只使用了一个调度轮询算法去选择一个工作进程。默认在除了 windows 的所有平台是可用的,它可以被全局的更改让负载均衡被操作系统去处理。
    调度轮询算法在循环的基础上通过所有可用的进程,将负载均匀地分布。第一个请求转发给第一个工作进程,第二个被转发到列表中的下一个工作进程,以此类推。当到达列表的最后,算法将会再一次从列表的头部开始。
    这是一个最简单和最广泛使用的负载均衡算法。但是并不是唯一的一个。更多有特色的算法允许赋权和选择最小负载量的或者最快响应的那一个服务器。

    首先在 Node.js 中 LB (load balance,负载均衡)是通过两个方式实现的,分别是 ①句柄共享(win)和 ② round-robin(*nix)。
    ① 句柄共享的方式主要用在 windows 上。具体是由主进程创建 socket 监听端口后,将 socket 句柄直接分发给感兴趣的 worker,然后当连接进来时,让 worker 直接自行 accept 然后处理。理论上这个方法应该是性能最好的, 但实际使用中存在比较大的分配不均的问题(常见情况是 8 个 worker,70%的连接跟其中的 2 个建立)。
    ② round-robin,时间片轮转法,所有平台的默认方案(除了 windows)。主进程监听端口,接收到新连接之后,通过时间片轮转法来决定将接收到的客户端的 socket 句柄传递给指定的 worker 处理。至于每个连接由哪个 worker 来处理,完全由内置的循环算法决定。
    这个 round-robin 的均衡程度比句柄共享要好一点,不过我想说还不如直接用 nginx 去配 upstream。值得一提的是 node 应用每个进程各自一个端口性能也比 cluster 要好。