1. 跨模块数据同步的挑战与目标

多模块架构下的 Room 数据库同步,核心矛盾源于 数据所有权分散 与 一致性边界模糊。不同模块各自维护 Room 实例,却需要共享或部分共享同一份业务数据。本章从数据一致性、同步粒度、同步策略三个维度拆解挑战,并定义可交付的目标文档。

1.1 多模块数据一致性问题

当模块 A、B、C 各自持有 Room 数据库副本时,数据同步面临三种典型不一致场景:

  • 写后读不一致:模块 A 写入 user 表,模块 B 立即读取仍为旧数据(因本地缓存未触发跨模块通知)。
  • 更新丢失:模块 A 和模块 C 同时对同一用户信息的 email 字段做本地修改,互相覆盖。
  • 级联失败:模块 B 删除订单时需同步更新模块 A 中的库存表,若同步链路中断则数据孤岛。
关键洞察:真正的问题不是数据库技术本身,而是跨模块事务边界无法跨越 Room 实例。每个模块的 Room 数据库是独立的事务上下文,无法保证全局 ACID。
多模块数据一致性问题拓扑 模块 A Room (user + order) 模块 B Room (order + inventory) 模块 C Room (user + analytics) user.email 写后读不一致 | 更新丢失 order.id 级联同步失败 → 库存孤岛 信任链路: 无统一写入网关 同步粒度: 表级 → 字段级 统一共识:需要强同步契约 + 数据所有权映射 写后读一致、更新不丢失、级联可重试

1.2 同步粒度决策

跨模块同步并非必须复制整张表。决策树基于数据变更频率、字段耦合度、消费者数量将粒度分为三级:

粒度级别 适用场景 典型风险
表级同步 低频低并发配置表(如 app_config) 网络带宽浪费;触发全表替换导致短暂断流
行级同步 用户详情、订单主记录等核心实体 行冲突需版本号 / 时间戳裁决
字段级同步 高竞争字段(如 email、库存数量) 监听逻辑复杂;需字段级脏标记
选型权衡:字段级同步看似最精准,但引入的监听代码量和字段映射维护成本通常超过收获。实践中多采用“行级 + 白名单字段”模式,即整行推送但消费者只取用白名单字段,避免数据膨胀。

1.3 交付物:同步挑战矩阵与目标定义文档

本章验收标准是产出正式文档,包含以下两部分:

同步挑战矩阵

按模块对列出数据一致性威胁、同步粒度、信任链路断裂点:

模块对 共享数据 一致性威胁 推荐粒度 信任链路要求
A ↔ B order 行 级联失败(减库存) 行级 强顺序写入 + 重试至少一次
A ↔ C user.email 写后读不一致 字段级 双写确认 + 缓存失效
B ↔ C order_stat 聚合 更新丢失 表级(批处理) 本地日志 + 定时合并

目标定义文档(摘要)

  1. 强同步:任何跨模块写入,在本地提交后 500ms 内到达目标模块 Room 实例。
  2. 字段级一致性:同一字段在两个模块间不允许出现静默覆盖,必须携带版本号或时间戳。
  3. 可恢复链路:网络或进程中断后,同步队列必须支持持久化重放,不丢失变更。
  4. 无侵入集成:模块只需声明共享数据范围和字段白名单,不修改原有 DAO。
落地检查点:在架构评审时使用该矩阵逐行审查模块间依赖,可提前暴露 80% 的数据同步隐患。矩阵应随着业务迭代持续更新,而非一次完成。

1.4 风险点与初步应对

  • 死锁风险:两个模块同时对同一行做更新 → 引入全局锁序列或版本号 + 乐观锁。
  • 级联风暴:一条订单变更引发 N 个模块连锁同步 → 设置单次同步最大链路深度(推荐 3 层)并降级为 TTL 缓存。
  • Room 版本不兼容:各模块 Room 版本若不一致可能导致 schema 差异 → 强制对齐 Room.databaseBuilder 的版本号,并在 CI 中校验。

1.5 落地步骤(本章范围)

  1. 盘点模块共享数据资产:输出各模块 Room 实体映射表,标记跨模块引用的表名与字段。
  2. 构建同步挑战矩阵:按本章模板完成初版,评审确认三大一致性威胁场景。
  3. 选定同步粒度:在矩阵中为每对模块关系标注推荐粒度(表/行/字段)。
  4. 定义验收断言:明确“写后读一致”的度量方法(例如模块 B 在模块 A 写入后 10 次连续读取均为最新值)。
  5. 冻结目标文档:包含同步粒度表、一致性 SLA、信任链路契约供后续章节设计。

本章不涉及具体实现代码,但为后续的数据同步管道、消息契约、冲突解决策略提供了决策基线。下一阶段将基于此目标文档设计 跨模块数据同步管道。