性能优化 #

一、性能优化概述 #

1.1 优化方向 #

方向 说明
响应时间 减少请求处理时间
吞吐量 提高并发处理能力
资源利用 优化CPU、内存使用
网络传输 减少数据传输量

1.2 优化策略 #

  • 启用压缩
  • 使用缓存
  • 数据库优化
  • 集群模式
  • 异步处理

二、响应压缩 #

2.1 compression中间件 #

bash
npm install compression
javascript
const compression = require('compression');

app.use(compression());

2.2 配置选项 #

javascript
app.use(compression({
    filter: (req, res) => {
        if (req.headers['x-no-compression']) {
            return false;
        }
        return compression.filter(req, res);
    },
    threshold: 1024,
    level: 6
}));

三、缓存策略 #

3.1 HTTP缓存 #

javascript
app.use(express.static('public', {
    maxAge: '1d',
    etag: true,
    lastModified: true
}));

3.2 Redis缓存 #

bash
npm install redis
javascript
const redis = require('redis');
const client = redis.createClient();

const cacheMiddleware = (key, ttl = 3600) => {
    return async (req, res, next) => {
        const cacheKey = typeof key === 'function' ? key(req) : key;
        
        try {
            const cached = await client.get(cacheKey);
            if (cached) {
                return res.json(JSON.parse(cached));
            }
            
            res.sendResponse = res.json;
            res.json = (body) => {
                client.setEx(cacheKey, ttl, JSON.stringify(body));
                res.sendResponse(body);
            };
            
            next();
        } catch (error) {
            next();
        }
    };
};

app.get('/users', cacheMiddleware('users:list', 300), async (req, res) => {
    const users = await User.find();
    res.json(users);
});

3.3 内存缓存 #

javascript
const NodeCache = require('node-cache');
const cache = new NodeCache({ stdTTL: 100, checkperiod: 120 });

const cacheMiddleware = (key, ttl) => {
    return (req, res, next) => {
        const cached = cache.get(key);
        if (cached) {
            return res.json(cached);
        }
        
        res.sendResponse = res.json;
        res.json = (body) => {
            cache.set(key, body, ttl);
            res.sendResponse(body);
        };
        
        next();
    };
};

四、数据库优化 #

4.1 连接池 #

javascript
const mongoose = require('mongoose');

mongoose.connect(process.env.DATABASE_URL, {
    maxPoolSize: 10,
    minPoolSize: 2,
    socketTimeoutMS: 45000
});

4.2 索引优化 #

javascript
userSchema.index({ email: 1 }, { unique: true });
userSchema.index({ name: 1, createdAt: -1 });

4.3 查询优化 #

javascript
const users = await User.find()
    .select('name email')
    .lean()
    .limit(10);

4.4 批量操作 #

javascript
await User.insertMany(users);
await User.updateMany({ role: 'user' }, { isActive: true });

五、集群模式 #

5.1 cluster模块 #

javascript
const cluster = require('cluster');
const os = require('os');

if (cluster.isMaster) {
    const numCPUs = os.cpus().length;
    
    for (let i = 0; i < numCPUs; i++) {
        cluster.fork();
    }
    
    cluster.on('exit', (worker) => {
        cluster.fork();
    });
} else {
    require('./app');
}

5.2 PM2 #

bash
npm install pm2 -g

ecosystem.config.js:

javascript
module.exports = {
    apps: [{
        name: 'my-app',
        script: './app.js',
        instances: 'max',
        exec_mode: 'cluster',
        autorestart: true,
        watch: false,
        max_memory_restart: '1G',
        env: {
            NODE_ENV: 'production'
        }
    }]
};

启动:

bash
pm2 start ecosystem.config.js

六、异步处理 #

6.1 消息队列 #

bash
npm install bull
javascript
const Queue = require('bull');
const emailQueue = new Queue('email');

emailQueue.process(async (job) => {
    const { to, subject, body } = job.data;
    await sendEmail(to, subject, body);
});

app.post('/send-email', async (req, res) => {
    await emailQueue.add(req.body);
    res.json({ message: '邮件已加入队列' });
});

6.2 后台任务 #

javascript
const processInBackground = (task) => {
    setImmediate(async () => {
        try {
            await task();
        } catch (error) {
            console.error('后台任务失败:', error);
        }
    });
};

app.post('/users', async (req, res) => {
    const user = await User.create(req.body);
    
    processInBackground(async () => {
        await sendWelcomeEmail(user.email);
        await updateStatistics();
    });
    
    res.status(201).json(user);
});

七、负载测试 #

7.1 使用autocannon #

bash
npm install autocannon -g
bash
autocannon -c 100 -d 30 http://localhost:3000/api/users

7.2 使用Artillery #

bash
npm install artillery -g

artillery.yml:

yaml
config:
    target: 'http://localhost:3000'
    phases:
        - duration: 60
          arrivalRate: 10
scenarios:
    - flow:
        - get:
            url: '/api/users'

运行:

bash
artillery run artillery.yml

八、监控 #

8.1 应用监控 #

javascript
const promBundle = require('express-prom-bundle');

app.use(promBundle({
    includeMethod: true,
    includePath: true
}));

8.2 APM工具 #

bash
npm install newrelic

8.3 日志监控 #

javascript
const winston = require('winston');

const logger = winston.createLogger({
    level: 'info',
    format: winston.format.json(),
    transports: [
        new winston.transports.File({ filename: 'error.log', level: 'error' }),
        new winston.transports.File({ filename: 'combined.log' })
    ]
});

九、总结 #

性能优化要点:

策略 说明
压缩 减少传输数据量
缓存 减少重复计算
数据库优化 索引、连接池
集群 利用多核CPU
异步处理 提高响应速度

下一步,让我们学习测试!

最后更新:2026-03-28