【问题标题】:Syncing multiple Socket.io clients同步多个 Socket.io 客户端
【发布时间】:2014-09-30 21:33:21
【问题描述】:

我正在构建一个应用程序,它在前面使用 Angular.js,在后面使用 Express 上的 Socket.IO 和 Redis。

套接字的基本用途是允许一种类型的用户将项目推送到由第二种类型的用户组消费的列表。

一个简单的例子: 学生可以将消息推送到班级列表中,并且只有该班级的老师才能看到该列表。

我正在尝试在不同时间连接的多位教师之间同步列表, 列表存储在 Redis 存储中,我想知道同步客户端的正确方法是否:

A.在每次更新时发送列表 - 无需在客户端管理同步并避免潜在的不匹配。

B.仅在连接时发送列表并对后续事件应用增量更新。

我确信过去已经解决了这个问题,因为这似乎是套接字通信的一个基本问题,但我无法找到明确的答案。

谢谢!

【问题讨论】:

  • 对于您描述的单服务器规模,请选择您认为最好的支持。对于更大的规模,您可能必须使用更像 B 的东西。无论哪种方式,您所描述的听起来都很合理。
  • 谢谢@dandavis!我想我会选择更面向未来的方法。
  • 你可以天真地做,如果他们在正确的“池/房间/列表”中,只需将每条新消息附加到用户的列表中。为了提供这种简单性的稳健性,每次更新都发送一个总预期长度,如果特定客户端缺少某些内容,则单独为该用户重新加载整个列表(可能与客户端启动顺序大致相同)

标签: javascript websocket redis socket.io synchronization


【解决方案1】:

如果列表不是特别大,那么我认为您想要一些简单的东西。我能想到的最简单的方法如下:

  1. 学生创建对列表的更改并向服务器发送消息(可以是 ajax 调用,不一定是 Web 套接字)。

  2. 服务器收到消息并将其放入适当的列表存储中。

  3. 然后,服务器会查找监视该列表的所有客户端并向它们发送更新消息。

  4. 教师连接到服务器。教师正在监控的所有列表都会完整地发送给教师,并且他们会订阅这些列表的更新。

这样,您永远不会真正进行同步,这大大简化了事情 - 您只是在进行下载列表,然后进行增量更新。只有一个主商店。如果客户离线,他们只需获得一份新的列表副本,并在他们重新上线时重新订阅更新。避免同步使整个解决方案变得更加简单。这假设数据不是特别大,因此只需根据需要获取列表的新副本是可行的。

如果您确实想要进行同步,那么一种相当简单的技术是在服务器上维护一个存储的主副本,并让每个更改交易硬币都有一个单调递增的交易 ID。然后,每个同步的副本可以只跟踪他们同步的最后一个事务 ID 并请求此后的所有事务。数据存储需要以事务的形式跟踪所有更改(通常通过为每个事务写入事务日志,或者可能是某些数据库中的一个功能),因此可以为任何正在同步的客户端回放任何给定的事务集。

【讨论】:

  • 感谢@jfriend00,我可能在这种情况下误用了同步一词,但您的第一个建议似乎是可行的方法。虽然可能有大量列表,但每个列表都非常小,因此可以使用。
猜你喜欢
  • 2018-08-23
  • 1970-01-01
  • 1970-01-01
  • 2015-10-27
  • 2012-06-15
  • 1970-01-01
  • 2020-03-08
  • 2012-11-27
  • 2020-06-30
相关资源
最近更新 更多