2. 架构分层总览:核心职责与边界
离线优先架构的核心是将网络通信从业务逻辑中彻底解耦。为实现这一目标,本课程定义五层结构:表现层、离线逻辑层、同步层、存储层、网络监控层。每一层都有明确的职责边界、对外契约与信任链路,共同支撑“离线可用、在线同步”的用户体验目标。
| 层级 | 核心职责 | 对外暴露接口(概念) | 关键依赖 |
|---|---|---|---|
| 表现层 | 驱动 UI 状态,展示乐观更新结果,绑定数据与视图 | 用户操作事件、状态回调 | 依赖离线逻辑层获取数据 |
| 离线逻辑层 | 编排业务用例,管理命令队列,维护一致性与冲突策略 | 命令提交、观察者查询 | 依赖存储层持久化,依赖同步层收发 |
| 同步层 | 管理网络连接池,执行增量/全量同步,适配远端协议 | 变更集推送、同步状态回调 | 依赖存储层读取待同步数据 |
| 存储层 | 本地持久化,索引构建,离线查询支持 | CRUD 接口、事务支持 | 无上层依赖,是被依赖方 |
| 网络监控层 | 检测网络连通性,估算带宽与延迟,下发状态策略 | 连接状态事件(onConnect/onDisconnect) | 依赖系统 API,为各层提供信号 |
架构边界原则: 表现层不直接调用同步层;离线逻辑层是唯一的中介。网络监控层只发事件,不参与业务决策。
边界与组件契约(信任链路)
- 表现层 ↔ 离线逻辑层: 表现层信任离线逻辑层返回的数据一定是“当前最新的本地状态”,不关心该状态是来自缓存还是刚刚同步完成。离线逻辑层信任表现层发出的命令是合规的业务请求。
- 离线逻辑层 ↔ 同步层: 离线逻辑层负责生成“变更集”并放入待发送队列,同步层负责消费。同步层不应反向修改业务队列,只能通过回调通知发送结果(成功/冲突/失败)。
- 离线逻辑层 ↔ 存储层: 存储层保证持久化。离线逻辑层信任数据写入后即可用于查询,但必须处理写入失败(如磁盘满)的降级逻辑。
- 网络监控层 → 各层: 单向无阻塞信号。各层信任监控层下发的状态(如onWiFiConnected),但必须自行处理信号抖动(如多次快速切换的防抖保护)。
信任链路设计要点: 层间通信必须基于明确的接口契约(Interface / Protocol),避免跨层直接操作数据。离线逻辑层是唯一有权启动事务和协调一致性的组件。
选型权衡与核心风险点
| 层级 | 关键权衡点 | 核心风险 |
|---|---|---|
| 表现层 | 乐观更新粒度:整体页面更新 vs 细粒度字段更新 | 乐观状态与持久化状态不一致导致 UI 闪烁或数据丢失 |
| 离线逻辑层 | 队列一致性:立即写入 vs 批量合并写入 | 队列积压导致内存溢出;顺序依赖操作导致死锁 |
| 同步层 | 冲突策略:Last-Write-Wins vs 自定义合并 / 拉分支 | 简单策略导致数据覆盖;复杂策略导致开发成本剧增 |
| 存储层 | 索引策略:多索引 vs 单索引 + 内存排序 | 写入放大严重拖慢插入速度;索引不足导致查询性能退化 |
| 网络监控层 | 检测频率:实时短间隔 vs 长间隔保电 | 频繁唤醒导致设备耗电;间隔过长导致同步不及时 |
架构级风险提醒: 各层耦合边界模糊是离线架构失败的首要原因。特别是离线逻辑层错误地承担了同步层的调度职责,或存储层直接暴露事务细节给表现层,都会导致架构退化。
落地步骤与验收标准
建议分 4 步落地:
- 定义层间接口契约: 使用接口定义语言(IDL)或严格的数据类(Data Class),明确每一层的输入输出。不跨层引用内部实现。
- 实现网络监控层 + 存储层: 这两层是基础依赖,先行实现并单测覆盖边界情况(如信号频繁切换、存储空间满)。
- 构建离线逻辑层核心编排: 先实现命令队列与本地一致性,再接入同步层做端到端联调。
- 表现层与隐式同步接入: 表现层只绑定离线逻辑层暴露的State/Domain Model。同步过程对UI完全透明。
验收标准清单:
- 边界闭合: 替换存储层实现(如从SQLite切换到MMKV)不影响离线逻辑层与同步层代码。
- 离线韧性: 无网络环境下,所有核心链路均可完成操作并正确持久化。
- 状态一致性: 网络恢复后,本地数据与远端数据最终一致(允许秒级延迟)。
- 性能基准: 列表页离线查询 < 100ms;命令队列处理 < 5ms/条(在主流中端设备上)。
- 节能表现: 后台同步时,系统监控无异常耗电(续航衰减 < 5%/h)。