Nginx
如何使 node.js 中的 TCP 伺服器具有粘性?
這是一個 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 是應用程序伺服器而不是 Web 伺服器,因此通常建議使用 Web 伺服器進行反向代理,但我如何實現 Apache、Nginx 或 HAproxy 來滿足我的案例?
如果我不使用任何前端網路伺服器,是否需要面對任何後果?
使用 haproxy
mode tcp
看起來你可以平衡這個流量。我看不出有粘性的原因。