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