请解释集群的概念,并说明在 Node.js 环境中搭建集群以及实现负载均衡的具体做法。
考察说明
考察对集群概念的理解以及在 Node.js 中利用多进程实现负载均衡的实践能力。
回答思路
- 【回答框架 1】集群是指将多台服务器或多进程组合起来,对外提供统一服务,以提高可用性、并发处理能力和可扩展性。在 Node.js 中,由于单线程模型,集群主要利用多核 CPU,通过多个进程共享同一个端口来提升吞吐量。
- 【回答框架 2】Node.js 内置 cluster 模块可以轻松创建集群。主进程负责管理,使用 fork() 生成多个工作进程,每个工作进程独立运行事件循环,并监听同一个端口。主进程可通过 round-robin 等策略将连接分发给工作进程,实现负载均衡。
- 【回答框架 3】实现步骤:在主进程中调用 cluster.isMaster(或 cluster.isPrimary)判断角色,使用 cluster.fork() 创建子进程,并监听 'online'、'exit' 等事件以重启崩溃的进程。工作进程可处理 HTTP 请求,通过 process.pid 区分。
- 【回答框架 4】负载均衡除了内建的 round-robin 外,还可以结合反向代理(如 Nginx)进行更细粒度的策略,如基于 IP 哈希、最小连接数等。同时可通过 PM2 等进程管理器简化集群的部署和管理,支持自动重启与负载均衡。
- 【关键点 1】集群由多进程组成,共享端口,提高并发和可用性。
- 【关键点 2】Node.js 使用 cluster 模块实现,主进程 fork 工作进程,并利用事件循环处理请求。
- 【关键点 3】负载均衡可通过 round-robin 或反向代理实现,注意进程间通信和状态共享问题。
- 【易错点 1】勿混淆集群与多线程,Node.js 集群为多进程,不共享内存,不适合无状态服务。
- 【易错点 2】有状态服务需使用外部存储(如 Redis)存储会话或数据,否则负载均衡可能导致数据不一致。
- 【易错点 3】注意工作进程数通常设为 CPU 核心数,过多会导致上下文切换开销增大。