Nginx

如何使 node.js 中的 TCP 伺服器具有粘性?

  • February 4, 2018

這是一個 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 來滿足我的案例?

如果我不使用任何前端網路伺服器,是否需要面對任何後果?

使用 haproxymode tcp

看起來你可以平衡這個流量。我看不出有粘性的原因。

引用自:https://serverfault.com/questions/895598