Skip to content

Express 中实现负载均衡和高可用性

在 Express 中实现负载均衡和高可用性通常需要结合架构设计外部工具,以下是常见方法及步骤:

一、负载均衡实现方案

1. 使用 Node.js 集群模式(Cluster Module)

  • 原理:利用多核 CPU,创建多个进程处理请求。
  • 实现
javascript
const cluster = require('cluster');
const os = require('os');
const express = require('express');
if (cluster.isMaster) {
  const numCPUs = os.cpus().length;
  for (let i = 0; i < numCPUs; i++) {
    cluster.fork(); // 创建工作进程
  }
  cluster.on('exit', (worker) => {
    console.log(`Worker ${worker.process.pid} died, restarting...`);
    cluster.fork(); // 自动重启崩溃的进程
  });
} else {
  const app = express();
  app.get('/', (req, res) => res.send('Hello from Worker!'));
  app.listen(3000);
}
  • 工具优化:使用 PM2 简化集群管理:
bash
pm2 start app.js -i max  # 自动根据 CPU 核心数启动集群
pm2 save                # 保存配置
pm2 startup             # 设置开机自启(提升可用性)

2. 反向代理负载均衡

  • 使用 Nginx
nginx
http {
  upstream express_servers {
    server 127.0.0.1:3000;
    server 127.0.0.1:3001;
    server 192.168.1.2:3000; # 另一台服务器的实例
    least_conn;              # 负载均衡策略(如轮询、加权等)
  }
  server {
    listen 80;
    location / {
      proxy_pass http://express_servers;
      proxy_set_header Host $host;
    }
  }
}
1. 部署多个 Express 实例(不同端口或不同服务器)。
2. 配置 Nginx 作为反向代理:
  • 其他工具:HAProxy、Traefik 等。

3. 容器化与编排(Kubernetes)

  • 将 Express 应用 Docker 化,通过 Kubernetes 自动调度和管理容器副本。
  • 示例 Kubernetes 部署配置:
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: express-app
spec:
  replicas: 3  # 启动 3 个副本
  selector:
    matchLabels:
      app: express
  template:
    metadata:
      labels:
        app: express
    spec:
      containers:
        - name: express
          image: your-docker-image
          ports:
            - containerPort: 3000

二、高可用性(HA)策略

1. 多实例部署

  • 在不同服务器或可用区(云环境)部署多个 Express 实例,避免单点故障。

2. 健康检查与自动恢复

  • Nginx 健康检查
nginx
upstream express_servers {
  server 127.0.0.1:3000 max_fails=3 fail_timeout=30s;
  server 127.0.0.1:3001 max_fails=3 fail_timeout=30s;
  check interval=5000 rise=2 fall=3 timeout=1000; # 定期检查后端健康状态
}
  • Kubernetes 探针
yaml
livenessProbe:
  httpGet:
    path: /health
    port: 3000
  initialDelaySeconds: 15
  periodSeconds: 20
readinessProbe:
  httpGet:
    path: /ready
    port: 3000
  initialDelaySeconds: 5
  periodSeconds: 10

3. 数据库与外部服务冗余

  • 使用主从复制(如 MySQL、PostgreSQL)或分布式数据库(如 MongoDB 分片)。
  • 会话管理:使用 Redis 或 Memcached 共享 Session,避免实例间状态不一致。

4. 容灾与故障转移

  • 云服务商方案:如 AWS ALB + Auto Scaling Group、Azure Load Balancer 等。
  • DNS 故障转移:通过 DNS 服务(如 Route 53)切换流量到备用区域。

三、注意事项

  1. 无状态设计:确保应用无状态(如使用 JWT 或共享 Session 存储)。
  2. 日志与监控:集中收集日志(ELK 栈),使用 Prometheus + Grafana 监控性能。
  3. 压力测试:通过工具(如 Artillery、LoadTest)模拟流量,验证负载均衡效果。

总结

  • 开发环境:可使用 PM2 集群模式快速验证。
  • 生产环境:建议结合 Nginx/Kubernetes 和云服务,实现全链路高可用。
    根据实际业务规模选择合适的方案,小型项目可简化部署,大型系统需考虑多层级冗余和自动化运维。

前端知识体系 · wcrane