实时更新性能问题
Real Time Update Performance Issue
我创建了一个 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 倍的时间)。
这让我有以下问题需要回答:
- 满足此要求的最佳解决方案是什么?
- 多线程是不是像Node JS中的集群一样的解决方案?
- 还有比集群更好的多线程方法吗?
使用 io.emit
向 所有 客户发送消息。但是,当 one 客户端 ping 时执行此操作,因此当有 9000 个客户端时,您每秒向 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 }); }
});
我假设数据对所有客户都是通用的,如果是这样的话,我会提出以下建议
客户端
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 秒发送一次。如果数据是特定于客户的,那么您将不得不以类似的方式处理它
我创建了一个 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 倍的时间)。 这让我有以下问题需要回答:
- 满足此要求的最佳解决方案是什么?
- 多线程是不是像Node JS中的集群一样的解决方案?
- 还有比集群更好的多线程方法吗?
使用 io.emit
向 所有 客户发送消息。但是,当 one 客户端 ping 时执行此操作,因此当有 9000 个客户端时,您每秒向 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 }); }
});
我假设数据对所有客户都是通用的,如果是这样的话,我会提出以下建议
客户端
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 秒发送一次。如果数据是特定于客户的,那么您将不得不以类似的方式处理它