mongodb 真实的更新性能问题

g0czyy6m  于 2023-03-07  发布在  Go
关注(0)|答案(2)|浏览(139)

我已经创建了一个平均堆栈应用程序,在网页上有一个 Jmeter 板图标,当它从后端数据库获得真实的更新时,它会改变颜色。为了实现这一点,我使用了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.满足此要求的最佳解决方案是什么?
1.多线程是不是像Node JS中的集群一样的解决方案?
1.还有比集群更好的多线程方法吗?

szqfcxe2

szqfcxe21#

我假设数据对所有客户端都是通用的,如果是这样,我建议如下
客户端

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

xa9qqrwz

xa9qqrwz2#

使用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 }); }
});

相关问题