MST

星途 面试题库

面试题:Node.js TCP Socket在微服务架构的负载均衡策略

假设你正在设计一个使用Node.js TCP Socket的微服务架构,且该架构需要处理高并发请求。请描述至少两种你会采用的负载均衡策略,解释为什么选择这些策略,以及如何在Node.js中通过TCP Socket实现这些策略。
28.7万 热度难度
前端开发Node.js

知识考点

AI 面试

面试题答案

一键面试

随机负载均衡策略

  1. 选择原因:实现简单,在请求分布较为均匀的情况下能较好地分摊负载,避免单个节点压力过大。它不依赖于复杂的状态跟踪,可在一定程度上随机地将请求分配到不同的后端服务实例上。
  2. 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');
});

轮询负载均衡策略

  1. 选择原因:按照顺序依次将请求分配到各个后端服务实例,实现也较为简单,能保证每个后端实例都有机会处理请求,适用于后端服务实例性能相近的场景。
  2. 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');
});