Это 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 в этом отношении, чтобы удовлетворить мой вариант использования?
Если я не использую какой-либо интерфейсный веб-сервер, есть ли какие-либо последствия, с которыми придется столкнуться?
Использовать haproxy с режимом tcp
Похоже, вы можете сбалансировать этот трафик. Я не вижу причин для липкость.