Node.js套接字IO:如何持续保存套接字数据到MongoDB

我正在使用THREE.js在浏览器中构build3D游戏。 很多的乐趣,但我遇到了以下情况:

在我的3D场景中的一个对象不断地移动,由用户input驱动。 我需要实时将对象的位置保存到我的数据库。

我们从前端开始。 Angular.js使用内置的$watch函数来观察我的对象的位置。 对象的位置可以每秒更改多次

在每次更改时,我使用Socket IO向后端Node.js服务器发送事件,如下所示:

 socket.emit('update', { id: id, position: position }); 

后端 ,事件被捕获并立即发送到同一个Socket IO Room中的其他成员。 这样,这个房间里的每个人都可以获得最实时的更新。

现在,因为事件每秒可能发生多次 ,所以我不想在每次更改时更新我的MongoDB集合,因为这会导致很多开销。 相反,我正在寻找一种偶然将数据保存到数据库的方式。

我想出了一个解决scheme,使用Node.js的setInterval函数,每1000ms保存数据。 对于在后端接收的每个不同的id (每个对象都是唯一的),将在JavaScript对象上创build一个新的键,从而跟踪每个对象的变化。

后端的(简化)代码:

 let update_queue = new Object(); // ... // Update Event socket.on('update', (msg) => { // Flag Changes if (!update_queue[msg.id]) update_queue[msg.id] = { changes: true }; // Set Interval Timer if (!update_queue[msg.id].timer) { update_queue[msg.id].timer = setInterval(() => { if (!update_queue[msg.id].changes) { clearInterval(update_queue[msg.id].timer); return; } // This saves data to MongoDB Object3DCollection.update(msg.id, msg.position) .then((res) => { console.log('saved'); }); // Unflag Changes update_queue[msg.id].changes = false; }, 1000); } // Immediate Broadcast to Socket Room socket.broadcast.to('some_room').emit('object_updated', msg); }); 

问题

这是处理非常频繁的套接字数据,并仍然保存到数据库的正确方法? 还是有任何其他的build议/解决scheme更robuust或更好地工作。

注意

我不想等待我的对象被保存到数据库, 然后将保存的数据发送到套接字空间的其余部分。 数据库写入操作的延迟不适合我正在处理的实时游戏情况。

提前致谢! 所有的build议/解决scheme都受到赞赏,将被考虑。