【发布时间】: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时,
- 修改的描述被插入到内存数据库中;
- 通知其他服务器有新版本的 C 可用;
- 向客户端发送更新。
当然,其他服务器一旦收到通知,也会将更新发送给它们的客户端。
后台的另一个进程将通过以下方式更新集群:
while(内存数据库包含少于 K 个集合 C 的更新)
- 从内存数据库中读取下一个更新 U;
- 使用 U 以原子方式更新集合 C 及其在集群中的版本号。
更新必须是可线性化的,即任何服务器都不能看到集合 C 处于上一次更新之前已应用更新的状态。
当集群完全一致时,我们从内存数据库中删除更新,从最低版本到最高版本。
问题
我的解决方案需要一个支持事务(ACID?)并提供强一致性的数据库(用于集群)。例如,我不能使用 MongoDB。
问题
你能想出一个更简单的解决方案吗?
或
如果我的解决方案可以接受,您建议集群使用什么数据库?
感谢您的耐心等待。
【问题讨论】:
标签: mongodb web-applications redis synchronization database