这是一个用于从 GPS 服务器接收数据的 TCP 服务器
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 是一个应用程序服务器而不是 Web 服务器,因此通常建议使用 Web 服务器进行反向代理,但是如何实现 Apache 或 Nginx 或 HAproxy 以满足我的用例?
如果我不使用任何前端 Web 服务器,会面临什么后果吗?
答案1
使用 haproxymode tcp
看起来您可以平衡此流量。我看不出有什么理由要坚持下去。