javascript - 实时更新性能问题

标签 javascript node.js mongodb express mean-stack

我创建了一个 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 倍的时间)。

这让我需要回答以下问题:

  1. 满足此要求的最佳解决方案是什么?
  2. 多线程是一种类似于 Node 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 秒向所有客户端发送实时消息。如果数据特定于客户,那么您将必须以类似的方式处理此问题

关于javascript - 实时更新性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48972197/

相关文章:

javascript - 尝试删除 Meteor 中的文档时 : "Remove failed: Internal server error"

java - 如何使用 java 在 Mongo 3.x 中执行文本搜索

javascript - 为什么 (new Date() == new Date()) 为假,而 (Date() == Date()) 为真?

javascript - 调用 javascript 警报后,php 代码未执行

javascript - react-sound-强制React组件更新并定位?

node.js - 将存储对象所属对象与未创建的父对象序列化

mongodb - 通过 MongoDB 中的 collection.update 将所有数组值更新为Upper

javascript - Babel 将其替换为 undefined

node.js - "Error: The ` libsass ` binding was not found..."在 Nodejs 4.2.4 lts 中,但在 5.4.1 中使用 docker

mysql - node-mysql connection.end() 去哪里