性能优化 #
一、性能优化概述 #
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