Javascript 同步多个Socket.io客户端

Javascript 同步多个Socket.io客户端,javascript,websocket,redis,socket.io,synchronization,Javascript,Websocket,Redis,Socket.io,Synchronization,我正在构建一个应用程序,正面使用Angular.js,背面使用Express上的Socket.IO和Redis 套接字的基本用法是允许一种类型的用户将项目推送到由第二种类型的用户组使用的列表中 一个简单的例子: 学生可以将消息推送到班级列表中,只有该班级的老师才能看到该列表 我正在尝试在不同时间连接的多个教师之间同步列表, 列表存储在Redis商店中,我想知道同步客户端的正确方法是: A.在每次更新时发送列表-省去了在客户端管理同步的需要,并避免了潜在的错误匹配 B.仅在连接时发送列表,并对连续

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

套接字的基本用法是允许一种类型的用户将项目推送到由第二种类型的用户组使用的列表中

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

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

A.在每次更新时发送列表-省去了在客户端管理同步的需要,并避免了潜在的错误匹配

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

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


谢谢

如果列表不是特别大,那么我想你应该选择一些简单的。我能想到的最简单的事情如下:

  • Student创建对列表的更改并将消息发送到服务器(可以是ajax调用,而不必是web套接字)

  • 服务器接收消息并将其放入适当的列表存储中

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

  • 教师连接到服务器。教师正在监控的任何列表都将全部发送给教师,并订阅这些列表的更新

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


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

    对于您描述的单服务器规模,请选择您认为最支持的。对于更大的规模,你可能必须用更像B的东西。你所描述的听起来很有道理。谢谢@dandavis!我想我会选择更适合未来的方法。你可以天真地这样做,只要将每个新消息附加到用户的列表中,如果它们在正确的“池/房间/列表”中。为了提供这种简单性的健壮性,在每次更新时发送一个总的预期长度,如果某个特定的客户端缺少某些内容,则仅为该用户重新加载整个列表(可能与客户端启动序列大致相同),谢谢@jfriend00,我可能在这里误用了sync这个词,但你的第一个建议似乎是正确的。虽然可能有大量的列表,但每个列表都非常小,因此这是可行的。