我正在建立一个用于在地图视图中显示车辆位置的Web应用程序,AngularJS作为前端,Node.js作为用于实时更新地图的服务器。事件来自中间件应用程序到节点服务器,然后服务器必须在那里应用一些逻辑来将数据广播到所需的连接客户端。
提出问题 - 我目前面临的问题是,一次有大约20K的车辆数据到节点服务器,然后节点服务器必须决定哪些连接的客户端应该更新数据。这个通过将每个数据循环到每个连接的客户端的映射边界来实现。如果传入的数据边界在连接的客户端边界内,则特定数据将被发送到该客户端。因此,如果有1K客户端和20K数据,整个过程将花费更多时间。
有没有办法通过使用任何节点技术来减少此服务器过载?
我尝试过:我读过节点集群,但我认为它涉及在多个工作者之间分配连接。这是解决我问题的方法吗?
示例代码段如下:
节点服务器端逻辑
users // user array eg: array(userSocketId1,userSocketId2);
bounds //each user's bounds array eg:array({userSocketId1:boundsValue},{userSocketId2:boundsValue2});
app.post('/addObject', (req, res) => {
for (var k = 0; k < Object.keys(req.body).length; k++) {
var point=[{'lat':req.body[k].lat,'lng':req.body[k].lng,'message':req.body[k].message,'id':req.body[k].id}];
for (var i = 0; i < users.length; i++) {
var userBounds = bounds[users[i]];
if(typeof userBounds!=='undefined'){
var inbounds = inBounds(point[0],userBounds); // check whether current vehicle's bounds within user's bounds
var user = users[i];
if(inbounds){
io.to(user).emit('updateMap', point); // send that vehicle data to one client say user
}
}
}
}
res.send('Event received in Node Server');
});
用于绘制车辆信息以映射的客户端逻辑
socket.on('updateMap', function(msg){
L.marker([msg.lat, msg.lng]).addTo(map);
});
答案 0 :(得分:1)
您可以尝试的第一件事是使代码异步,就像使用Promise一样。
没有任何库,这应该更好:
app.post('/addObject', (req, res) => {
Promise.all(Object.keys(req.body).map((k) => {
let point=[
{
'lat':req.body[k].lat,
'lng':req.body[k].lng,
'message':req.body[k].message,
'id':req.body[k].id
}
];
Promise.all(users.map((user) => {
let userBounds = bounds[user];
if(typeof userBounds!=='undefined'){
let inbounds = inBounds(point[0], userBounds); // check whether current vehicle's bounds within user's bounds
if(inbounds){
io.to(user).emit('updateMap', point); // send that vehicle data to one client say user
}
}
}));
})).then(() => {
res.send('Event received in Node Server');
}).catch((error) => {
res.send(error);
});
});
其他优点包括不必处理索引,更容易处理错误。
可能没有用,但每次收到请求时都不会阻止,这已经是一个巨大的改进。
答案 1 :(得分:1)
对于现有架构,您需要执行以下操作 -
或者您需要更新架构,您需要存储具有套接字ID和用户ID的用户位置。并且您需要获得符合您标准的所有套接字ID。
答案 2 :(得分:0)
这里的表演选手是Mongo
怎么样?
如果您使用多个对象,例如
Customer=>{...} l times
Clients=>{...} m times
data=>{client_id:'something',...} n times
然后您需要循环每个数据并检入它。等于l * m * n
这是拯救很多东西的伎俩
Customer:{
_id:Object('someid')
,client:{
_id:Object('someid'),
data:{
...
}
}
}
它将减少循环因子并给出结果l *(内部没有客户端)*(内部没有数据)。