如何同步CouchDB和PostgreSQL

10
我们有一个基于RoR构建的Web应用程序,使用PostgreSQL数据库。现在我们需要将移动应用程序集成到其中,并且希望移动应用程序能够管理离线模式,因此需要在Web应用程序和移动应用程序之间同步信息。
问题是,如果我已经将数据存储在PostgreSQL中,而我需要使用CouchDB和PouchDB进行离线同步,我该怎么办?
谢谢!

看一下LoopBack。它允许与许多数据库进行离线同步,包括Postgres(但需要Node.js)。 - Kul
@Kul FYI,使用LoopBack v4,他们没有计划构建离线同步。不过,他们欢迎社区做出贡献。 - PaulMest
@PaulMest 是的,那很不幸。可以理解,因为这不是微不足道的事情,每个人都希望以不同的权衡来获得不同类型的“离线支持”。对于外部人员来说,这是一个绝佳的机会。 - Kul
3个回答

8

请确保只写在CouchDb上,PostgreSQL仅用于读取数据。在这种情况下,您可以使用CouchDb的_changes订阅来将所有数据复制回您的PostgreSQL数据库以进行只读访问。


5

0

我还没有看到针对你的问题的直接解决方案,但是你可以从这个新技术中获取一些想法。

如果您想要移动在线/离线同步,可以使用GraphQL复制协议而不是CouchDB复制协议。

一个快速的技巧是在PostgreSQL前使用Hasura “即插即用”GraphQL反应式后端,为其提供离线/在线GraphQL同步功能。在前端,您需要RxDB(它使用PouchDB作为存储引擎)或Apollo JS(它是GraphQL客户端)。这些是Javascript库,类似的东西可能存在于移动世界中。

关于数据库架构,它可能不像你想象的那么即插即用。您必须对要复制的表进行一些调整。根据CAP定理,PostgreSQL(作为SQL数据库)为您提供数据一致性和可用性(无分区能力)。然后,CouchDB / PouchDB为您提供数据可用性和可分区性(最终一致性)。

离线优先应用程序的数据库必须是最终一致的,并且能够处理版本冲突,因为当文档/行在两个不同的地方同时更改时,可能会发生这种情况。

所需求的是在PostgreSQL上实现最终一致性特性。这可以通过在每个离线优先准备好的表中创建一个名为revision_id的列并将其作为表的主键的一部分以及另一个具有先前revision_ids列表的列来完成。

我自己从未尝试过,但这里有一个tutorial解释了所有内容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接