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ć?
źródło
Odpowiedzi:
Użyj haproxy z
mode tcp
Wygląda na to, że możesz zrównoważyć ten ruch. Nie widzę powodu do lepkości.
źródło