pg_crdt 项目教程
pg_crdtPOC CRDT support in Postgres项目地址:https://gitcode.com/gh_mirrors/pg/pg_crdt
1、项目介绍
pg_crdt
是一个实验性的扩展,旨在为 PostgreSQL 添加对冲突自由复制数据类型(CRDTs)的支持。CRDTs 是一种可以在多台计算机/节点之间安全复制和同步的去中心化数据结构,是协同编辑应用(如 Notion)的关键技术。
项目背景
CRDTs 允许在多个节点之间进行数据同步,而无需担心冲突。pg_crdt
项目的目标是评估是否可以利用 PostgreSQL 支持的 CRDT 和 Supabase 现有的实时 API 进行变更数据捕获,以在 Supabase 平台上启用协同应用的开发。
2、项目快速启动
安装步骤
-
克隆项目仓库
git clone https://github.com/supabase/pg_crdt.git cd pg_crdt
-
使用 Docker 启动
docker-compose up
启动后,PostgreSQL 数据库将在以下地址可用:
postgresql://postgres:password@localhost:5582/sdb
-
启用扩展
在 PostgreSQL 中执行以下命令以启用扩展:
CREATE EXTENSION pg_crdt;
示例代码
以下是一个简单的示例,展示如何在 PostgreSQL 中使用 pg_crdt
扩展:
-- 设置搜索路径
SET search_path TO public,crdt;
-- 创建一个新的 CRDT 文档
SELECT crdt_new_ydoc() AS new_doc;
-- 合并两个文档
SELECT crdt_merge(crdt_new_ydoc(), crdt_new_ydoc()) AS merged_doc;
3、应用案例和最佳实践
应用案例
pg_crdt
可以用于开发需要实时协同编辑的应用,如在线文档编辑器、共享白板等。例如,多个用户可以同时编辑同一个文档,而无需担心数据冲突。
最佳实践
- 频繁更新的 CRDTs:对于频繁更新的 CRDTs,需要注意生成的 WAL(预写日志)和死元组(dead tuples)的数量。
- 大型 CRDT 类型:大型 CRDT 类型在更新时会产生显著的序列化/反序列化开销。
- 实时广播:使用 Supabase 的实时 API 广播数据库变更时,需要注意 WAL 包含完整的数据副本,因此小更新可能导致整个文档广播给所有协作者。
4、典型生态项目
Supabase
pg_crdt
是 Supabase 生态系统的一部分,Supabase 是一个开源的 Firebase 替代品,提供实时数据库、身份验证、存储等功能。通过结合 pg_crdt
和 Supabase 的实时 API,可以构建强大的协同应用。
Yjs/Yrs
pg_crdt
使用了 Rust 的 yrs
和 automerge
库,这些库提供了高效的 CRDT 实现。Yjs 是一个流行的 JavaScript 库,用于实现协同编辑功能。
pgx
pgx
是一个 Rust 框架,用于构建 PostgreSQL 扩展。pg_crdt
使用 pgx
框架来添加 PostgreSQL 原生 CRDT 支持。
通过这些生态项目的结合,可以构建出高效、可靠的协同应用。
pg_crdtPOC CRDT support in Postgres项目地址:https://gitcode.com/gh_mirrors/pg/pg_crdt