如何使 node.js 中的 TCP 服务器粘性?

如何使 node.js 中的 TCP 服务器粘性?

这是一个用于从 GPS 服务器接收数据的 TCP 服务器

const net = require('net');
const lora_packet = require('lora-packet');



const clients = [];


const server = net.createServer(function (socket) {
    socket.name = socket.remoteAddress + ":" + socket.remotePort;
    socket.device = new Device(socket);
    clients.push(socket);
    let bufferString = '';


    socket.on('data', function (data) {
        try {

            const packet = lora_packet.fromWire(data, 'hex');
            const str = packet._packet.PHYPayload.toString('hex');
            let prev = 0, next;
            while ((next = str.indexOf('0d0a', prev)) > -1) {
                bufferString += str.substring(prev, next + 4);
                console.log('got whole message: ' + bufferString);
                //Use the parts variable for futher communication
                socket.device.emit('data',bufferString);
                bufferString = '';
                prev = next + 4;
            }
            bufferString += str.substring(prev);

        } catch (err) {
            console.log("DATA RECEIVING PRODUCED AN ERROR" + err);
        }

    });
    socket.on('end', function () {
        clients.splice(clients.indexOf(socket), 1);
    });





})
// .listen(8080);


process.on('uncaughtException', function (err) {
    console.log('something terrible happened..')
    console.log(err);
})

module.exports = server;

我正在使用 TCP 服务器与 GPS 设备通信并与它们建立实时连接。

我有一个疑问,如何平衡 TCP 服务器的负载以避免单点故障?问题是,当形成 TCP 连接时,数据包不会自动分隔,因此我解析整个流以检查“0d0a”分隔符。

const str = packet._packet.PHYPayload.toString('hex');
                let prev = 0, next;
                while ((next = str.indexOf('0d0a', prev)) > -1) {
                    bufferString += str.substring(prev, next + 4);
                    console.log('got whole message: ' + bufferString);
                    //Use the parts variable for futher communication
                    socket.device.emit('data',bufferString);
                    bufferString = '';
                    prev = next + 4;
                }

如果我对 TCP 服务器进行负载平衡,那么是否应该将此连接粘贴到特定的服务器实例,因为我还将客户端连接存储在本地实例中?

const clients = [];

此外,由于 node.js 是一个应用程序服务器而不是 Web 服务器,因此通常建议使用 Web 服务器进行反向代理,但是如何实现 Apache 或 Nginx 或 HAproxy 以满足我的用例?

如果我不使用任何前端 Web 服务器,会面临什么后果吗?

答案1

使用 haproxymode tcp

看起来您可以平衡此流量。我看不出有什么理由要坚持下去。

相关内容