Jak sprawić, by serwer TCP w node.js był lepki?

0

Jest to serwer TCP do odbierania danych z serwera 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;

Korzystam z serwera TCP do komunikacji z urządzeniami GPS i ustanowienia z nimi połączenia na żywo.

Mam pytanie, w jaki sposób mam zrównoważyć serwer TCP, aby uniknąć pojedynczego punktu awarii? Problem polega na tym, że po utworzeniu połączenia TCP pakiety danych nie są rozdzielane automatycznie, dlatego analizuję cały strumień, aby sprawdzić separator „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;
                }

Czy nie powinienem uczynić tego połączenia lepszym w stosunku do konkretnej instancji serwera, jeśli równoważę obciążenie serwera TCP, ponieważ przechowuję również połączenia klientów w instancji lokalnej?

const clients = [];

Ponadto, ponieważ node.js jest serwerem aplikacji, a nie serwerem WWW, zwykle zaleca się, aby serwer WWW był używany do odwrotnego proxy, ale jak mogę zaimplementować Apache, Nginx lub HAproxy, aby ta sprawa wystarczyła dla mojego przypadku użycia?

Jeśli nie korzystam z zewnętrznego serwera WWW, czy są jakieś konsekwencje, z którymi trzeba się zmierzyć?

Abhishek Yadav
źródło
Potrzebujesz lepkości tylko wtedy, gdy klient rozłącza się, a następnie ponownie łączy ORAZ istnieje powód, dla którego klient musi wrócić na ten sam serwer. Urządzenie nie ma możliwości zmiany serwerów w ramach istniejącego połączenia TCP, więc nie musisz się martwić, że pakiety danych tego samego połączenia TCP będą wysyłane do różnych serwerów.
jfriend00
Wydaje mi się, że istniała wada w moim rozumieniu, myślałem, że moduł równoważenia obciążenia może wysłać niektóre pakiety z urządzenia na jeden serwer, a inne pakiety na inny serwer!
Abhishek Yadav
Również HAproxy może zmienić adres IP źródła dla urządzenia, czy można to obsłużyć?
Abhishek Yadav
Moduł równoważenia obciążenia równoważy tylko połączenia przychodzące, a nie pakiety na istniejącym połączeniu. Po ustanowieniu gniazda TCP wszystkie pakiety trafiają do serwera, który wybrał dla tego gniazda TCP.
jfriend00
Jeśli serwer proxy zmieni źródłowe IP dla mojego serwera, może występować problem polegający na tym, że nie uzyskam adresu IP urządzenia i nie będę mógł nawiązać komunikacji z urządzeniem!
Abhishek Yadav

Odpowiedzi:

0

Użyj haproxy z mode tcp

Wygląda na to, że możesz zrównoważyć ten ruch. Nie widzę powodu do lepkości.

kubańczyk
źródło
Urządzenie GPS wysyła dane do serwera z przerwami, a także jest to dane usprawnione, tj. Nie wysyła wszystkich informacji raz! Dlatego utrzymuję zmienną bufferString i słucham danych, aż napotkam ogranicznik dla pakietu! Czy nie wpłynie to na to, czy to samo urządzenie zostanie zrównoważone pod względem obciążenia na innym serwerze?
Abhishek Yadav