我们使用CouchDB和PouchDB在浏览器中复制远程数据库。 我们创建CouchDB的备份,以防万一出现问题。
在数据丢失时引入备份没有问题,但是将系统重置为旧状态似乎很难实现,这也应该影响所有同步的PouchDB。
例如:User1
和User2
将本地 PouchDB 与远程 CouchDB 同步。User1
创建一个新的文档D1
该文档也会同步到远程数据库和User2
。现在,User1
想要将数据库重置为创建D1
之前的状态。为此,用户删除自己的本地数据库并将远程 CouchDB 重置为以前的状态。当User1
与远程 CouchDB 同步时,D1
将不存在。但是User2
的本地数据库中仍然有D1
,一旦它与远程数据库同步,D1
也将回到CouchDB并同步到User1
的本地数据库。最终,系统将处于与重置之前相同的状态。
对于我们的项目,要求每个用户在备份系统之前删除本地数据库是不切实际的。
一个过程怎么会像这样将这样的分布式系统重置为旧状态。
一些额外的挑战:
- 这个例子相当简单,应该只是给出一个大致的想法正在发生的事情。最后,可能有大量的创建,编辑和删除操作必须通过备份撤消。
- 某些客户端在系统重置发生时可能处于脱机状态
好吧,没有简单的出路。一些选项是:
-
实际上不要删除数据库。相反,请调整还原方法,以便删除要还原的数据库中的所有文档,然后像备份中一样单独重新创建。您可以比较修订/使用
_changes
提要过滤掉可能保持不变的文档。
以 编程方式删除其他用户的本地数据库,然后再尝试同步,以防进行还原。
我不明白为什么在删除文档时必须从以前的状态恢复数据库 - 通常删除的数据库条目也会在其他同步客户端上被删除。
但是我有一个非常相似的设置,我必须定期删除CouchDB并设置一个新的。我所做的是向每个客户端发送一个信号,触发自动删除他的本地 PouchDB 并重新连接到数据库。效果很好。