我有 100 万恐龙用户全部登录。
恐龙希望看到其他恐龙何时实时更新它们的个人资料,因此它们被挂接到 NodeJS/Mongoose 模型中,如下所示:
dinosaur.schema.post('保存', 函数 (doc) {
socket.emit('恐龙:保存', doc);
});
其中 socket
是连接的 Dinosaur 的套接字。
恐龙还将看到其他一些事物的实时更新。也许是新闻、评论等等。
那么,我的问题是,在某些情况下,这种事件的发出会变得很大并影响性能吗?
在客户端,我会有类似 socket.on('dinosaur:save', function(){})
... 不需要时我会销毁监听器。但是,如果我正在监听每只dinosaur:save
,理论上我可以在一秒内处理一百万次保存(假设每只恐龙都在同一秒内更新了它们的个人资料)。似乎有一种更好的方法可以处理大型数据集。
我想我可能还想观看其他几个事件,我只是想知道是否有一些针对这种套接字管理的推荐方法。
编辑:要明确的是,我知道房间,但如果我有一个我所在区域附近所有恐龙的滚动列表,我可能只想接收所有恐龙:保存
事件。所以我还是不确定。
最佳答案
通知一百万件事情意味着很多数据包,如果您要通知的事情发生很多,那就是很多,甚至比尝试在屏幕上显示的数量还要多。
通常首先要考虑的是:
这些通知的实时性到底有多高?您能否在每个通知周期内将 60 秒或更长时间的通知批量打包到每个用户一个数据包中?
每个用户真的都必须看到其他用户的每一个更改吗?您知道任何用户界面绝对不可能呈现一百万个其他用户的状态。因此,我认为每个用户不必了解其他每个用户的状态。如果还有 1-50 个其他用户,也许可以,但如果有 100 万则不行。
您能否通过算法确定给定用户可能对哪些用户感兴趣并且仅向他们广播。例如,您能否仅让他们了解地理位置靠近他们的其他用户的最新信息?
您能否拥有一个用户界面,让用户告诉您他们想要跟踪哪些其他用户,以便您只更新这些用户?或者也许是他们告诉您的用户和他们在地理上感兴趣的用户的某种组合。关键是你无论如何都无法观看一百万个用户,所以你必须发明一个显示的用户界面,无论如何,显示的内容要少得多。
如果客户端还没有其他用户的状态,您始终可以拥有一个根据需要获取其他用户状态的 UI,因此您不必保留每个客户端中所有百万用户的状态(因为无论如何不可能一次全部显示)。如果用户浏览查看一些他们还没有的内容,您只需通过套接字或 ajax 调用从服务器获取它。
哦,按照您所说的规模,您可能需要将用户的连接分布在多个服务器上,因此您也必须处理这种复杂性。
关于javascript - NodeJS + SocketIO 大socket事件管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27371554/