【问题标题】:data synchronization between clients客户端之间的数据同步
【发布时间】:2014-07-19 19:35:07
【问题描述】:

我不知道这是否是问我问题的正确地方,但就在这里。

受 Firebase 的启发,我决定编写一个小框架来在客户端之间同步数据。这应该可以简化聊天、论坛等 Web 应用程序的开发......

假设有一台或多台服务器。客户端可以连接到一个服务器并访问特定的集合(例如聊天消息列表)。如果客户端修改了集合,这些修改将发送给请求访问同一集合的其他客户端。

我希望我的解决方案既快速又通用。修改的传播应该非常快,并且集合应该保存在数据库中。 集合可能非常大,但客户端可能只请求集合的视图(例如,最近 20 分钟的聊天消息)。

可能的解决方案

我们有 n 个服务器、一个带有快速内存数据库 (Redis) 的节点和一个带有 NoSQL DB 的集群。 集群将包含完整的集合。

当客户端连接到服务器并首次获得对集合的访问权限时,将直接从集群中读取集合的请求部分。

当客户端修改集合 C 时,修改将写入内存数据库,其中包含以下内容:

  • 123 添加了“消息...”
  • 124 已删除 id235
  • 125修改id143“新消息...”

其中 123、124 和 125 是集合的版本。

在这种情况下,集群包含整个集合 C 及其版本号 122。 当客户端第一次连接到服务器并访问集合 C 时,服务器从集群中读取集合的请求部分,然后从内存数据库中读取更新,以便将集合从版本 122 更新到版本 125。

当客户端修改集合C时,

  1. 修改的描述被插入到内存数据库中;
  2. 通知其他服务器有新版本的 C 可用;
  3. 向客户端发送更新。

当然,其他服务器一旦收到通知,也会将更新发送给它们的客户端。

后台的另一个进程将通过以下方式更新集群:

while(内存数据库包含少于 K 个集合 C 的更新)

  1. 从内存数据库中读取下一个更新 U;
  2. 使用 U 以原子方式更新集合 C 及其在集群中的版本号。

更新必须是可线性化的,即任何服务器都不能看到集合 C 处于上一次更新之前已应用更新的状态。

当集群完全一致时,我们从内存数据库中删除更新,从最低版本到最高版本。

问题

我的解决方案需要一个支持事务(ACID?)并提供强一致性的数据库(用于集群)。例如,我不能使用 MongoDB。

问题

你能想出一个更简单的解决方案吗?

如果我的解决方案可以接受,您建议集群使用什么数据库?

感谢您的耐心等待。

【问题讨论】:

    标签: mongodb web-applications redis synchronization database


    【解决方案1】:

    如果集合的每个元素都被分配了一个唯一的 id 并且内存数据库中的更新包括这些 id,那么不需要集群中集合的版本号,并且所以交易是不必要的。

    这个想法是可以使用 id 来决定是否需要更新。例如,如果更新说

    version=123 action=ADD id=05276 msg="Message"

    并且集群中的集合已经包含一个 id=05276 的文档,那么这个更新是旧的并且已经应用​​于集群中的集合。

    我们只需要注意这一点:在从内存数据库中删除一些更新之前,我们必须确保这些更新已应用于集群中的集合,并且集群与该集合完全一致.

    当客户端请求访问集合时,它连接的服务器需要:

    1. 从内存数据库中读取所有更新并将它们保存在内存中
    2. 从集群中读取(相关部分)集合
    3. 使用保存在内存中的更新更新读取集合

    首先从内存数据库中读取所有更新以避免竞争条件很重要。考虑这种情况:

    1. 我们从集群中读取了旧版本的集合
    2. 集合已更新
    3. 集群变得完全一致
    4. 从内存数据库中删除了一些更新
    5. 我们使用新的更新更新我们的读取集合

    问题是,在第 5 点我们会错过一些更新。

    【讨论】:

      猜你喜欢
      • 2012-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多