Как сделать TCP-сервер в node.js липким?

Это TCP-сервер для получения данных от GPS-сервера

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-соединения пакеты данных не разграничиваются автоматически, поэтому я анализирую все stream, чтобы проверить разделитель «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 - это сервер приложений, а не веб-сервер, это s обычно рекомендуется использовать веб-сервер для обратного проксирования, но как я могу реализовать Apache, Nginx или HAproxy в этом отношении, чтобы удовлетворить мой вариант использования?

Если я не использую какой-либо интерфейсный веб-сервер, есть ли какие-либо последствия, с которыми придется столкнуться?

0
задан 4 February 2018 в 17:01
1 ответ

Использовать haproxy с режимом tcp

Похоже, вы можете сбалансировать этот трафик. Я не вижу причин для липкость.

0
ответ дан 5 December 2019 в 06:38

Теги

Похожие вопросы