我不知道这是否是提出问题的正确位置,但现在就是。
受到Firebase的启发,我决定编写一个小框架来同步客户端之间的数据。这应该简化聊天,论坛等Web应用程序的开发......
假设有一个或多个服务器。客户端可以连接到一个服务器并访问特定集合(例如,聊天消息列表)。如果客户端修改集合,那么这些修改将发送给请求访问同一集合的其他客户端。
我希望我的解决方案能够快速而通用。修改的传播应该非常快,并且集合应该保存在DB上。 集合可能非常大,但客户可能只请求集合的视图(例如,最近20分钟的聊天消息)。
可能的解决方案
我们有n台服务器,1个带快速内存数据库(Redis)的节点和带有NoSQL DB的集群。 群集将包含完整的集合。
当客户端连接到服务器并且第一次被授予对集合的访问权限时,将直接从集群中读取所请求的集合部分。
当客户端修改集合C时,修改将写入内存数据库,其中包含以下内容:
其中123,124和125是该集合的版本。
在这种情况下,群集包含整个集合C及其版本号122。 当客户端首次连接到服务器并访问集合C时,服务器从集群中读取集合的请求部分,然后从内存数据库中读取更新,以便将集合从版本122更新到版本125。
当客户修改集合C时,
当然,其他服务器一旦得到通知,也会将更新发送给客户。
后台的另一个过程将通过以下方式更新群集:
while(内存数据库包含少于K个集合C的更新)
更新必须是可线性化的,即没有服务器能够在上次更新之前应用更新的状态下看到集合C.
当群集完全一致时,我们会从内存数据库中删除从最低版本到最高版本的更新。
问题
我的解决方案需要一个支持事务的数据库(用于集群)(ACID?)并提供强大的一致性。例如,我无法使用MongoDB。
问题
你能想到一个更简单的解决方案吗?
或
如果我的解决方案可以接受,您建议群集使用什么数据库?
感谢您的耐心等待。
答案 0 :(得分:0)
如果为集合中的每个元素分配了唯一的 id ,并且内存数据库中的更新包含这些ID,则不需要该集合中的版本号。集群,所以交易是不必要的。
这个想法是id可以用来决定是否需要更新。例如,如果更新说明
version = 123 action = ADD id = 05276 msg =" Message"
并且群集中的集合已包含id = 05276的文档,然后此更新已旧,并且已应用于群集中的集合。
我们只需要注意这一点:在我们从内存数据库中删除一些更新之前,我们必须确保这些更新已应用于集群中的集合,并且集群与集合完全一致
当客户端请求访问集合时,它所连接的服务器需要:
首先从内存数据库中读取所有更新以避免竞争条件非常重要。请考虑以下情况:
问题是,在第5点,我们错过了一些更新。