内容提要
Supabase发布了pg_crdt,这是一个为Postgres添加CRDT支持的实验性扩展。CRDT(无冲突复制数据类型)允许多个用户同时修改数据而无需中央协调,确保最终状态一致。该扩展支持Yjs和Automerge,旨在简化协作应用的开发。
延伸解读
实验性扩展的定位与风险
pg_crdt 被明确标记为实验性扩展,且尚未在 Supabase 平台发布,未来也可能不会。这意味着它目前仅适合本地测试或技术预研,不适合直接用于生产环境。开发者应关注其 GitHub 仓库的更新和讨论,但需自行承担早期采用的风险。
CRDT 在 Postgres 中的实现方式
pg_crdt 将 CRDT 作为原生数据类型集成到 Postgres 中,例如使用 crdt.ydoc 类型存储 Yjs 文档。这种设计使 CRDT 更新具备交换律和幂等性,即任意顺序应用多次结果一致。与将 CRDT 逻辑放在 Realtime 中间层相比,直接存入数据库简化了架构,并允许其他工具(如 Debezium)直接消费变更。
已知限制与性能考量
文章列出了几个关键限制:Realtime 通过 WAL 广播变更,而 WAL 包含完整数据副本,导致小更新也会广播整个文档;频繁更新的 CRDT 会产生大量 WAL 和死元组;大型 CRDT 类型在更新时带来显著的序列化/反序列化开销。这些限制意味着当前方案在高频协作场景下可能面临性能瓶颈。
技术选型与长期可持续性
Supabase 强调只押注能存活 20 年的技术,因此选择 Postgres 而非全新 CRDT 数据库。pg_crdt 同时支持 Yjs 和 Automerge,因为两者都有 Rust 和 JavaScript 实现,能兼顾浏览器与数据库环境。未来若采用此方案,Supabase 计划为移动端构建 Yjs/Automerge 库,但这一切仍取决于社区反馈和实验进展。
Q&A
pg_crdt是什么?
pg_crdt是一个为Postgres添加CRDT支持的实验性扩展,旨在简化协作应用的开发。
CRDT的主要功能是什么?
CRDT允许多个用户同时修改数据而无需中央协调,确保最终状态一致,解决数据冲突问题。
pg_crdt支持哪些库?
pg_crdt扩展支持Yjs和Automerge库。
pg_crdt如何解决数据冲突?
pg_crdt通过将CRDT作为数据类型添加到Postgres中,确保多个用户的修改可以无缝合并,避免冲突。
Supabase未来对pg_crdt有什么计划?
Supabase计划为移动设备构建Yjs和Automerge库,以支持更广泛的协作应用。
pg_crdt的实现考虑了哪些因素?
pg_crdt的实现考虑了与Postgres的兼容性和长期技术可持续性。