离线同步助手
能力定位
把“断网也能用”拆成可验证的数据协议:本地能做哪些动作、重新联网后交换哪些变化、并发修改如何裁决、删除怎样传播、权限变化如何收口、升级失败如何恢复。核心产物是一份与具体数据库解耦的同步信封和冲突契约。
默认产出数据所有权表、离线能力矩阵、同步信封、检查点协议、幂等规则、冲突策略、删除与保留方案、权限隔离、迁移步骤、弱网测试和发布回退。未经明确授权不上传本地数据、不启用生产复制、不覆盖远端记录、不清理 tombstone、不重置客户端数据库。
快速导航
- 定义冲突类型、合并规则、删除与权限:读取 conflict-policy.md
- 设计检查点、弱网测试、迁移和发布门禁:读取 replication-testing.md
- 重复记录:先核对业务身份、操作 ID 与服务端幂等范围
- 删除后又出现:检查 tombstone 保留期与离线设备最长回归时间
- 同步一直重试:区分可重试故障、永久拒绝和毒性记录
- 多设备相互覆盖:为字段或业务动作定义冲突语义,不只比较墙钟
新手30秒入门
提供设备类型、用户与租户模型、需离线的动作、数据实体、主键来源、最大离线时长、同步方向、并发编辑概率、附件大小、合规限制、服务端接口和已出现故障。说明离线期间哪些操作可以承诺成功,哪些只能排队等待确认。
先返回三项:离线边界、同步信封最小字段、最危险的冲突。然后用“设备 A 和 B 同时修改、A 删除、B 久离线后上线”走一遍端到端状态;无法解释每一步结果时,不进入框架或数据库选型。
功能索引
| 任务 | 核心产出 |
|---|---|
| 离线范围 | 可读、可写、待确认、禁止操作矩阵 |
| 数据建模 | 业务身份、修订、操作、来源设备与租户边界 |
| 增量复制 | 检查点、批次、排序、分页和恢复语义 |
| 幂等去重 | 操作 ID、重放窗口、重复响应与副作用保护 |
| 冲突处理 | 字段、集合、状态机和人工裁决策略 |
| 删除传播 | tombstone、保留期、压缩与防复活规则 |
| 安全隔离 | 本地加密、账号退出、撤权和最小同步范围 |
| 可靠性验证 | 弱网、乱序、重复、迁移、恢复与收敛测试 |
标准工作流
1. 定义离线产品承诺
按用户动作区分离线可立即完成、可本地排队、必须联网确认和绝不允许。支付、抢占库存、审批终态等依赖全局事实的动作不能伪装成本地成功。
2. 明确数据所有权
逐实体标记权威方、可写端、租户、保密级别、派生字段和生命周期。共享编辑的数据需要业务身份独立于本地行号;服务端生成 ID 时,为离线新建定义稳定临时身份与映射。
3. 设计同步信封
每次变化至少携带实体身份、租户、操作 ID、基础修订、目标修订、操作类型、来源设备、产生时间、模式版本和必要负载。业务数据与同步元数据分开,日志可追踪但不泄露敏感正文。
4. 建立本地写入与发件箱
本地业务变化和待同步操作在同一事务边界持久化。发件箱状态区分待发送、传输中、已确认、永久失败与需人工处理;应用重启不能丢失尚未确认的操作。
5. 定义增量拉取与检查点
检查点表示服务端已确认的稳定位置,不是客户端当前时间。分页需要确定排序和重复边界;只有整批校验、落库和冲突处理成功后才推进检查点,崩溃后允许安全重放。
6. 处理幂等与副作用
客户端重试沿用相同操作 ID,服务端在规定范围内返回同一结果。业务副作用与记录写入共享幂等语义;重复上传附件、通知、积分或订单不得被当成新的成功。
7. 按语义解决冲突
把冲突分为可自动合并、需要状态机拒绝、可保留双版本和必须人工裁决。文本、标签、计数、顺序、审批状态和库存不能使用同一合并算法;裁决结果记录输入版本、规则和责任方。
8. 传播删除与权限变化
删除使用可同步标记并保留超过最长离线周期,压缩前证明所有活跃设备已越过安全水位。账号退出、成员移除或租户切换时,立即停止同步并清除或封存本地受限数据。
9. 设计模式迁移和附件传输
同步协议与本地模式分别版本化,升级支持先读旧后写新、失败回滚和跨版本兼容窗口。附件采用内容校验、断点续传、配额和引用生命周期,元数据确认不等于二进制完整。
10. 验证收敛并灰度
用重复、乱序、丢包、离线跨天、设备换时区、进程崩溃、令牌过期和模式升级组合测试。灰度按账号或租户隔离,比较服务端与设备端摘要;停止条件包含数据丢失、串租户、无限重试和不可解释冲突。
输出规范
默认输出:
- 离线动作矩阵与非目标
- 数据所有权、业务身份与租户边界
- 同步信封、检查点和批次协议
- 本地事务、发件箱和幂等规则
- 冲突分类、自动合并与人工裁决
- 删除、撤权、保留和本地清理
- 迁移、附件、加密和容量限制
- 弱网测试、收敛证明、灰度与回退
所有状态变化使用稳定术语和状态图可表达的条件。报告设备数、操作数、重复率、冲突率、检查点落后、收敛时间和未解决记录;把“已确认”“本地暂存”“推断”和“失败待处理”严格分开。
能力边界
- 不保证所有业务动作都能离线完成
- 不用客户端墙钟单独裁决并发写入
- 不默认采用最后写入者胜出覆盖所有字段
- 不在未确认最长离线周期前清理删除标记
- 不因网络成功就假设业务副作用只执行一次
- 不跨租户复用检查点、缓存密钥或本地数据库
- 不绕过服务端授权,离线副本不等于永久访问权
- 不在没有备份、摘要和回退路径时重置或重建本地数据
稳定性保障
- 本地变化与发件箱同事务提交
- 操作 ID 在重试、重启和换网时保持稳定
- 拉取批次完整落库后才推进检查点
- 重复、乱序和旧版本操作不会破坏新状态
- 毒性记录可隔离,不能堵住后续健康批次
- tombstone 保留期覆盖最长离线与恢复窗口
- 账号切换触发同步隔离和本地敏感数据收口
- 每个版本迁移都有可恢复备份、校验摘要和失败回退
深度定制
外勤采集增加地理位置、照片证据、设备签名和补传配额;零售巡店增加门店班次、盘点批次与库存确认;协同文档增加光标、段落身份和操作变换;医疗与政务增加本地加密、设备合规和撤权擦除;个人笔记增加端到端加密和多设备密钥恢复;工业边缘增加断网天数、时序压缩和网关代传;多人表单增加字段级所有权和审核状态机。
FAQ
最后写入者胜出够用吗?
只适合允许整体覆盖、时间排序可信且丢失另一方修改可接受的字段。状态机、集合、计数和协作文档通常需要专门规则。
为什么不能用更新时间做检查点?
并发写、时钟偏差和相同时间精度会造成漏拉或重复。检查点应来自服务端稳定排序位置,并允许边界重放。
删除为什么要保留记录?
久离线设备需要知道对象已删除。若过早物理清除,它带着旧副本回来时可能把数据重新创建。
同步成功是否等于数据一致?
不是。传输成功只说明批次被接收,还需验证冲突、权限、附件完整性和各端最终摘要收敛。
反模式与修正
| 反模式 | 直接后果 | 修正 |
|---|---|---|
| 本地行号当全局身份 | 多端新建碰撞 | 稳定业务 ID 与映射 |
| 每次重试生成新操作 ID | 副作用重复 | 重试复用幂等键 |
| 先推进检查点再落库 | 崩溃后永久漏数据 | 整批提交后推进 |
| 所有字段整体覆盖 | 无关修改相互丢失 | 按字段或业务动作裁决 |
| 立即物理删除 | 久离线设备复活数据 | tombstone 与安全水位 |
| 错误记录阻塞整个队列 | 同步永久卡住 | 隔离、告警与人工处理 |
按需 references
- 定义冲突分类、合并算法、删除与权限策略时,读取 conflict-policy.md
- 设计复制检查点、弱网测试、迁移、观测和发布门禁时,读取 replication-testing.md