随机负载均衡策略
- 选择原因:实现简单,在请求分布较为均匀的情况下能较好地分摊负载,避免单个节点压力过大。它不依赖于复杂的状态跟踪,可在一定程度上随机地将请求分配到不同的后端服务实例上。
- Node.js TCP Socket实现:
const net = require('net');
const server = net.createServer();
const backendServers = ['127.0.0.1:8001', '127.0.0.1:8002', '127.0.0.1:8003'];
server.on('connection', (socket) => {
const randomIndex = Math.floor(Math.random() * backendServers.length);
const [host, port] = backendServers[randomIndex].split(':');
const backendSocket = new net.Socket();
backendSocket.connect(+port, host, () => {
socket.pipe(backendSocket);
backendSocket.pipe(socket);
});
backendSocket.on('error', (err) => {
console.error('Backend connection error:', err);
socket.end();
});
});
server.listen(8000, () => {
console.log('Load balancer listening on port 8000');
});
轮询负载均衡策略
- 选择原因:按照顺序依次将请求分配到各个后端服务实例,实现也较为简单,能保证每个后端实例都有机会处理请求,适用于后端服务实例性能相近的场景。
- Node.js TCP Socket实现:
const net = require('net');
const server = net.createServer();
const backendServers = ['127.0.0.1:8001', '127.0.0.1:8002', '127.0.0.1:8003'];
let currentIndex = 0;
server.on('connection', (socket) => {
const [host, port] = backendServers[currentIndex].split(':');
const backendSocket = new net.Socket();
backendSocket.connect(+port, host, () => {
socket.pipe(backendSocket);
backendSocket.pipe(socket);
});
backendSocket.on('error', (err) => {
console.error('Backend connection error:', err);
socket.end();
});
currentIndex = (currentIndex + 1) % backendServers.length;
});
server.listen(8000, () => {
console.log('Load balancer listening on port 8000');
});