客户端之间的数据同步

时间:2014-07-19 19:35:08

标签: mongodb web-applications redis synchronization database

我不知道这是否是提出问题的正确位置,但现在就是。

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

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

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

可能的解决方案

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

当客户端连接到服务器并且第一次被授予对集合的访问权限时,将直接从集群中读取所请求的集合部分。

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

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

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

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

当客户修改集合C时,

  1. 将修改的描述插入到内存中DB;
  2. 其他服务器被告知可以使用新版本的C;
  3. 向客户发送更新。
  4. 当然,其他服务器一旦得到通知,也会将更新发送给客户。

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

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

    1. 从内存数据库中读取下一个更新U;
    2. 使用U在ATOMICALLY中更新集群C及其在集群中的版本号。
    3. 更新必须是可线性化的,即没有服务器能够在上次更新之前应用更新的状态下看到集合C.

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

      问题

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

      问题

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

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

      感谢您的耐心等待。

1 个答案:

答案 0 :(得分:0)

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

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

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

并且群集中的集合已包含id = 05276的文档,然后此更新已旧,并且已应用于群集中的集合。

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

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

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

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

    1. 我们从群集中读取了旧版本的集合
    2. 该集合已更新
    3. 群集变得完全一致
    4. 从内存数据库中删除了一些更新
    5. 我们使用新的更新更新我们的阅读集合
    6. 问题是,在第5点,我们错过了一些更新。