【问题标题】:Real Time Update Performance Issue实时更新性能问题
【发布时间】:2018-02-25 09:48:37
【问题描述】:

我创建了一个 MEAN 堆栈应用程序,在网页上,这些是一个仪表板图标,可以改变颜色,因为它从后端数据库获取实时更新。为了实现这一点,我使用了 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倍的时间)。 Wich 给我留下了以下问题需要回答:

  1. 满足此要求的最佳解决方案是什么?
  2. 多线程是不是类似于 Node JS 中的集群的解决方案?
  3. 还有比集群更好的多线程方法吗?

【问题讨论】:

  • 我不明白你为什么将setInterval 与socket.io 一起使用? setInterval 似乎是套接字不需要的轮询解决方案!

标签: javascript node.js mongodb express mean-stack


【解决方案1】:

我假设所有客户的数据都是通用的,如果是这种情况,我会提出以下建议

客户端

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 秒。如果数据是特定于客户的,那么您将不得不以类似的方式处理此问题

【讨论】:

  • 感谢您的代码运行良好....现在我必须看看如何使代码工作,以便它能够分别向每个客户端发送消息并且没有性能延迟。
【解决方案2】:

使用io.emit所有 客户发送消息。但是,当 一个 客户端 ping 时,您会执行此操作,因此当有 9000 个客户端时,您每秒向 所有 客户端发送更新 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 }); }
});

【讨论】:

  • 感谢您的代码运行良好....现在我必须看看如何使代码工作,以便它能够分别向每个客户端发送消息并且没有性能延迟。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-18
  • 2018-01-07
  • 1970-01-01
相关资源
最近更新 更多