Electric-SQL 实战:构建类 Linear 的本地优先应用 Linearlite
项目概述
Linearlite 是基于 Electric-SQL 和 PGlite 技术栈构建的本地优先(local-first)应用示例,它完整复现了知名项目管理工具 Linear 的核心功能。这个示例项目展示了如何利用现代同步技术构建高性能、支持离线的协作应用。
核心技术栈
- Electric-SQL:实现数据双向同步的核心框架
- PGlite:轻量级浏览器端 PostgreSQL 实现
- React:前端用户界面框架
核心特性解析
数据同步架构
Linearlite 采用"通过数据库写入"(write through the database)模式,这种设计具有以下特点:
- 本地优先:所有操作首先在本地 PGlite 数据库执行
- 异步同步:变更随后异步同步到服务器
- 冲突处理:内置完善的冲突解决机制
大规模数据处理
项目特别设计了处理大规模数据的能力:
- 初始加载 100,000 个问题项及其评论
- 总数据量约 150MB
- 支持快速初始同步和即时本地响应
完整功能实现
- 双向数据同步:服务器与客户端之间的完整数据流
- 同步状态指示:清晰显示数据同步状态
- 高级查询功能:
- 问题和评论的过滤与排序
- 看板视图与拖拽排序
- 基于 PostgreSQL 全文检索的搜索功能
实现原理深度解析
后端架构
- PostgreSQL 数据库:作为唯一真实数据源
- Electric 同步服务:
- 管理数据同步流程
- 生成称为"shapes"的数据库子集复制流
- 写入服务器:处理客户端写入请求的轻量级 HTTP 服务
前端架构
- PGlite 数据库:浏览器内的 PostgreSQL 实现
- 同步插件:连接 PGlite 和 Electric 服务
- React 界面:直接与本地数据库交互的用户界面
写入路径技术细节
Linearlite 实现了两种主要的写入模式:
1. 写入时合并模式
- 单表存储所有数据
- 本地变更直接应用到表
- 服务器同步时合并变更
- 读取性能更优,适合大数据集
2. 读取时合并模式
- 使用两个表:服务器数据副本和本地变更表
- 读取时动态合并
- 可通过视图简化操作
关键技术实现
数据库表设计扩展
为支持同步功能,每个表都包含以下特殊字段:
deleted
:删除标记new
:新增标记modified_columns
:记录修改字段sent_to_server
:同步状态synced
:完全同步标记backup
:变更前数据备份
同步触发器机制
数据库触发器根据同步状态执行不同逻辑:
同步过程中:
- 插入:标记为服务器副本
- 更新:处理冲突合并
- 删除:物理删除
本地写入时:
- 插入:标记为新数据
- 更新:记录变更字段
- 删除:逻辑删除(标记删除)
同步流程优化
- 延迟触发器:初始同步完成前禁用
- 延迟索引创建:提高初始同步速度
- 按需全文索引:首次搜索时创建
实际应用建议
- 性能优化:对于大型应用,写入时合并模式通常更优
- 冲突处理:合理设计备份和恢复机制
- 用户体验:清晰的同步状态反馈至关重要
- 扩展性:写入服务器可扩展添加权限控制
总结
Linearlite 示例展示了 Electric-SQL 和 PGlite 在构建复杂本地优先应用方面的强大能力。通过这个项目,开发者可以学习到:
- 现代同步架构的设计思路
- 大规模数据处理的最佳实践
- 离线优先应用的核心实现模式
- 数据库级别的冲突解决方案
这个项目为希望构建类似 Linear 这样高质量协作工具的开发者提供了宝贵的技术参考和实现范例。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考