我创建了一个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数据库需要一些时间来回复更新值,以及回复客户端的响应时间,因此来自客户端的请求会在服务器上堆叠起来。只有一个客户端访问服务器,性能良好,但有3个客户端访问服务器,等待堆栈变得很大,性能开始下降很多(一个get请求需要5-10倍长)。 我想回答以下问题:
答案 0 :(得分:0)
使用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 }); }
});
答案 1 :(得分:0)
我假设数据对所有客户来说都是通用的,如果是这种情况,我建议如下
客户端
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秒,这基本上都会将实时消息发送给所有客户端。如果数据特定于客户端,那么您将必须以类似的方式处理此问题