如何使用 Socket.io 实时更新大量数据
Posted
技术标签:
【中文标题】如何使用 Socket.io 实时更新大量数据【英文标题】:How to keep a large set of data up to date in real time using Socket.io 【发布时间】:2021-04-19 10:32:45 【问题描述】:我正在编写一个具有多种用户类型的系统,该系统被授予不同级别的访问权限,以在数据库中创建删除和更新资源。因此,在我看来,这些资源应该实时显示,以便不显示已删除的资源而显示创建的资源。数据越及时,用户体验的问题似乎就越少。
使用 socket.io 我目前正在通过为用户订阅数据源来规避这个问题,他们的权限需要使用命名空间来区分用户类型的能力。我只是为每种数据订阅设置了 javascript 间隔,每秒都在数据库中敲击一组新数据,而不考虑数据是否实际更新,然后将其发送回用户应用程序。
这对于测试来说很好,但我一直在努力寻找一种解决方案来防止这种带宽浪费并减少数据库负载。我的一个想法是使用所有组织 ID 作为键填充一个全局对象,并在每个值中放置一个对象,其中每个数据订阅的名称作为键,这些值是最新的数据集。
通过这种方式,我可以将每个新套接字添加到他们加入的房间,并重构数据库查询以确定对每个订阅集的更改,我可以将这些更改作为一系列 socket.io 广播中继到相关的组织房间。
我对这个实现的主要保留是高服务器端内存需求降低可扩展性的可能性,以及如果客户端数据集错过任何这些广播,它们可能会变得不同步。这个解决方案对于生产服务器来说是可以接受的,还是有一个更简单/更好的解决方案,我没有看到从客户端的角度来保持大型数据集的实时性?
谢谢
【问题讨论】:
你想建立一个类似于更新足球比赛记分卡的系统吗?我之所以问,是因为它也有实时更新分数的大型数据集。 我不熟悉“记分卡”的大小和性质,但如果它是大量数据,那么可以。 【参考方案1】:首先,这完全取决于您构建的目的。您可以使用Redis 作为缓存存储。
您可以通过以下方式减少数据库调用:
-
先写入数据库并更新缓存,然后再从中读取
写入缓存并在达到某个点后执行批量操作
两者都可以使用
对于实时数据,您可以使用redis pub sub with socket io。您也可以使用Apache Kafka,它是一个可扩展、容错、发布-订阅消息传递系统,使您能够构建分布式应用程序并为诸如 LinkedIn、Twitter、AirBnB 和还有很多
您可以使用 shards 减少批量操作时数据库的负载(CPU 使用率)。只需确保不在同一台机器上制作分片。
如果错过任何这些广播,客户端数据集可能会变得不同步
不要认为有任何错过广播的机会,因为当时客户端必须由于某种原因断开连接,只有当客户端不在同一页面上或客户端出现代码问题时,套接字才能断开连接。当客户端再次连接时,将建立一个数据库来获取数据。所以,我认为这不会是一个问题。
结帐: Scalable architecture for socket.io
【讨论】:
以上是关于如何使用 Socket.io 实时更新大量数据的主要内容,如果未能解决你的问题,请参考以下文章
Socket.io 问题:使用“xhr-polling”初始化大量客户端