Performance Optimization
Optimize your Response Handler implementation for maximum performance in production environments.
Caching Strategies
Response Caching
Enable automatic response caching to improve performance:
javascript
const config = {
enablePerformanceTracking: true,
caching: {
enabled: true,
ttl: 300, // 5 minutes
redis: {
host: 'localhost',
port: 6379,
},
},
};
app.use(quickSetup(config));ETag Support
Automatic ETag generation for cacheable responses:
javascript
app.get('/api/users', (req, res) => {
const users = getUsersFromCache();
// Automatically generates ETag
res.ok(users, 'Users retrieved', {
cacheable: true,
etag: true,
});
});Request Optimization
Compression
Enable response compression for better bandwidth usage:
javascript
const compression = require('compression');
app.use(compression());
app.use(
quickSetup({
enablePerformanceTracking: true,
compression: {
enabled: true,
level: 6,
threshold: 1024,
},
}),
);Request Size Limits
Set appropriate request size limits:
javascript
app.use(
express.json({
limit: '10mb',
verify: (req, res, buf) => {
req.rawBody = buf;
},
}),
);
app.use(
quickSetup({
requestLimits: {
maxSize: '10mb',
timeout: 30000,
},
}),
);Database Optimization
Connection Pooling
Optimize database connections:
javascript
const { Pool } = require('pg');
const pool = new Pool({
user: 'username',
host: 'localhost',
database: 'mydb',
password: 'password',
port: 5432,
max: 20, // Maximum connections
idleTimeoutMillis: 30000,
connectionTimeoutMillis: 2000,
});
app.get('/api/users', async (req, res) => {
const startTime = Date.now();
try {
const client = await pool.connect();
const result = await client.query('SELECT * FROM users');
client.release();
const executionTime = Date.now() - startTime;
res.ok(result.rows, 'Users retrieved', {
performance: {
dbQuery: `${executionTime}ms`,
poolSize: pool.totalCount,
},
});
} catch (error) {
res.error(error, 'Failed to retrieve users');
}
});Query Optimization
Use prepared statements and optimized queries:
javascript
// Prepared statement example
const getUserStatement = 'SELECT * FROM users WHERE id = $1';
app.get('/api/users/:id', async (req, res) => {
try {
const result = await pool.query(getUserStatement, [req.params.id]);
if (result.rows.length === 0) {
return res.notFound({}, 'User not found');
}
res.ok(result.rows[0], 'User retrieved');
} catch (error) {
res.error(error, 'Failed to retrieve user');
}
});Memory Management
Stream Processing
Handle large data efficiently with streams:
javascript
const fs = require('fs');
const csv = require('csv-parse');
app.get('/api/export/users', (req, res) => {
res.setHeader('Content-Type', 'text/csv');
res.setHeader('Content-Disposition', 'attachment; filename="users.csv"');
const stream = fs.createReadStream('users.csv').pipe(csv()).pipe(res);
stream.on('error', (error) => {
res.error(error, 'Export failed');
});
});Memory Monitoring
Monitor memory usage:
javascript
const config = {
enablePerformanceTracking: true,
monitoring: {
memory: true,
cpu: true,
interval: 60000, // Check every minute
},
};
app.use(quickSetup(config));
// Memory usage endpoint
app.get('/api/system/memory', (req, res) => {
const memUsage = process.memoryUsage();
res.ok(
{
rss: `${Math.round(memUsage.rss / 1024 / 1024)} MB`,
heapTotal: `${Math.round(memUsage.heapTotal / 1024 / 1024)} MB`,
heapUsed: `${Math.round(memUsage.heapUsed / 1024 / 1024)} MB`,
external: `${Math.round(memUsage.external / 1024 / 1024)} MB`,
},
'Memory usage retrieved',
);
});Load Balancing
Cluster Mode
Use Node.js cluster for multi-core utilization:
javascript
const cluster = require('cluster');
const numCPUs = require('os').cpus().length;
if (cluster.isMaster) {
console.log(`Master ${process.pid} is running`);
// Fork workers
for (let i = 0; i < numCPUs; i++) {
cluster.fork();
}
cluster.on('exit', (worker, code, signal) => {
console.log(`Worker ${worker.process.pid} died`);
cluster.fork();
});
} else {
// Worker process
const express = require('express');
const { quickSetup } = require('response-handler');
const app = express();
app.use(
quickSetup({
enablePerformanceTracking: true,
clusterId: process.pid,
}),
);
app.listen(3000, () => {
console.log(`Worker ${process.pid} started`);
});
}Socket.IO Performance
Connection Management
Optimize Socket.IO connections:
javascript
const io = new Server(server, {
transports: ['websocket', 'polling'],
pingTimeout: 60000,
pingInterval: 25000,
maxHttpBufferSize: 1e6,
allowEIO3: true,
});
io.use(
quickSocketSetup({
enablePerformanceTracking: true,
rateLimiting: {
enabled: true,
maxConnections: 1000,
windowMs: 60000,
},
}),
);Room Optimization
Efficient room management:
javascript
io.on('connection', (socket) => {
socket.on('join-room', (roomId) => {
// Check room size before joining
const room = io.sockets.adapter.rooms.get(roomId);
const roomSize = room ? room.size : 0;
if (roomSize >= 100) {
socket.forbidden({}, 'Room is full');
return;
}
socket.join(roomId);
socket.ok({ roomId, participants: roomSize + 1 }, 'Joined room');
});
});Monitoring & Metrics
Performance Metrics
Track key performance indicators:
javascript
const config = {
enablePerformanceTracking: true,
metrics: {
responseTime: true,
throughput: true,
errorRate: true,
customMetrics: {
dbQueryTime: true,
cacheHitRate: true,
},
},
};
app.use(quickSetup(config));
// Metrics endpoint
app.get('/api/metrics', (req, res) => {
const metrics = getPerformanceMetrics();
res.ok(
{
averageResponseTime: metrics.avgResponseTime,
requestsPerSecond: metrics.rps,
errorRate: metrics.errorRate,
uptime: process.uptime(),
},
'Metrics retrieved',
);
});Health Checks
Implement comprehensive health checks:
javascript
app.get('/health', async (req, res) => {
const checks = {
database: await checkDatabase(),
cache: await checkCache(),
memory: checkMemory(),
disk: await checkDisk(),
};
const isHealthy = Object.values(checks).every((check) => check.status === 'ok');
if (isHealthy) {
res.ok(checks, 'All systems operational');
} else {
res.error(checks, 'System health issues detected');
}
});Production Optimizations
Environment Configuration
Production-specific optimizations:
javascript
const productionConfig = {
enableLogging: true,
logLevel: 'error',
enablePerformanceTracking: false, // Disable in production
enableSecurity: true,
compression: {
enabled: true,
level: 6,
},
caching: {
enabled: true,
ttl: 3600,
},
};
if (process.env.NODE_ENV === 'production') {
app.use(quickSetup(productionConfig));
}CDN Integration
Integrate with Content Delivery Networks:
javascript
app.use(
'/static',
express.static('public', {
maxAge: '1y',
etag: true,
lastModified: true,
setHeaders: (res, path) => {
if (path.endsWith('.js') || path.endsWith('.css')) {
res.setHeader('Cache-Control', 'public, max-age=31536000, immutable');
}
},
}),
);Best Practices
- Enable compression for all text-based responses
- Use caching strategically for frequently accessed data
- Implement connection pooling for database connections
- Monitor performance metrics continuously
- Use streams for large data processing
- Optimize database queries with proper indexing
- Implement rate limiting to prevent abuse
- Use CDN for static asset delivery
- Enable clustering for multi-core utilization
- Regular performance testing and optimization