实时更新性能问题



我创建了一个平均堆栈应用程序,其中在网页上这些是一个仪表板图标,它会更改颜色,因为它可以从后端数据库中获得实时更新。为此,我使用了socket.io。客户端代码在下面写入。

var socket = io();
setInterval(myfunction, 9000);
  function myfunction() {
    socket.on('realtime message', function (msg) {
      if (msg == 'yes') { marker.setIcon({ url: imagered });}
      else if (msg == 'almost') { marker.setIcon({ url: imageorange }); }
      else { marker.setIcon({ url: imagegreen }); }
    });
    socket.emit('realtime message', 'get the temprature');
  }

每9秒就会向服务器发送请求。

  var io = require('socket.io').listen(server);
  io.on('connection', function (socket) {
  console.log('a user connected');
  socket.on('realtime message', function (msg) {
      var flag = // get the value from Mongo DB
      if (flag == 'yes') {
        io.emit('realtime message', 'yes');
      }
      else if (flag == 'almost') {
        io.emit('realtime message', 'almost');
      }
      else { io.emit('realtime message', 'no'); }

mongo db需要一些时间才能通过更新值回复,加上响应的时间回到客户端,因此客户端的请求会在服务器上堆叠。只有一个客户端访问服务器,性能就不错,但是在3个客户端访问服务器的情况下,等待堆栈变得很大,并且性能开始下降很多(单个Get请求需要5-10倍(。

这给我带来以下问题要回答:

  1. 我将是最佳解决此要求的最佳解决方案?
  2. 多线程是否在节点JS中的群集?
  3. 其他多线程方法比集群更好?

我假设所有客户端都很常见,如果是这样,我会建议以下

客户端

var socket = io();
socket.on('realtime message', function (msg) {
  if (msg == 'yes') { marker.setIcon({ url: imagered });}
  else if (msg == 'almost') { marker.setIcon({ url: imageorange }); }
  else { marker.setIcon({ url: imagegreen }); }
});

服务器端

var io = require('socket.io').listen(server);
function updateClients () {
   var flag = // get the value from Mongo DB
   if (flag == 'yes') {
     io.emit('realtime message', 'yes');
   }
   else if (flag == 'almost') {
     io.emit('realtime message', 'almost');
   }
   else { io.emit('realtime message', 'no'); }
}
io.on('connection', updateClients);
setInterval(updateClients, 9000)

每当新客户端加入或每9秒加入时,这基本上将实时消息发送给所有客户端。如果数据是特定于客户端的,那么您将必须以类似的方式处理

使用 io.emit,您将消息发送到 all 客户端。但是,当一个一个客户端pings时,您会这样做,因此,当有9000个客户端发送更新到 all> ALL 时,客户端每秒1000次。这绝对是行不通的。可能会在服务器上进行间隔,并每9秒向所有客户发送更新。因此,客户只需要听。在服务器上看起来像这样:

var io = require('socket.io').listen(server);
setInterval(() => {
  var flag = // get the value from Mongo DB
  if (flag == 'yes') {
    io.emit('realtime message', 'yes');
  } else if (flag == 'almost') {
    io.emit('realtime message', 'almost');
  } else { 
    io.emit('realtime message', 'no');
  }
}, 9000);

在客户端您只需要听:

socket.on('realtime message', function (msg) {
  if (msg == 'yes') { marker.setIcon({ url: imagered });}
  else if (msg == 'almost') { marker.setIcon({ url: imageorange }); }
  else { marker.setIcon({ url: imagegreen }); }
});

相关内容

  • 没有找到相关文章

最新更新