第2章 需求与约束分析:业务离线场景识别、数据一致性等级、网络不稳定性假设、设备能力约束
离线优先架构的成败首先取决于对业务场景和物理约束的精准识别。本章围绕四类核心输入——业务离线场景、数据一致性等级、网络不稳定性假设、设备能力约束——逐一展开分析,并输出对架构边界、系统分层、模块职责、数据流与信任链路、选型权衡、风险点、落地步骤和验收标准的直接影响。
2.1 业务离线场景识别
离线场景不是简单的“断网可用”,需要从用户操作流程中分离出必须在线和可以离线完成的子任务。以下是通过任务分解法识别的三类典型离线场景:
| 离线场景分类 | 典型任务 | 离线时长要求 | 本地数据量估算 | 对架构边界的影响 |
|---|---|---|---|---|
| 设备本地控制 | 开关、参数调节、状态查看 | ≥ 8 小时(单班次) | ≤ 10 MB(配置 + 日志) | UI 层 + 控制逻辑必须全闭环于本地进程 |
| 现场数据采集 | 传感器读数、巡检记录、照片上传 | ≥ 24 小时(跨班次) | ≤ 500 MB(含非压缩图片) | 本地写缓存 + 顺序日志,同步为异步任务 |
| 离线报表查看 | 昨日产量、告警历史、趋势图 | ≥ 48 小时(周末) | ≤ 200 MB(预聚合数据) | 服务端推送快照,本地只读仓库 |
场景识别完成后,架构边界清晰:所有用户可见操作(点击、滑动、输入)必须在本地 500ms 内响应,只有在触发同步时才允许网络依赖。同时,拒绝将离线功能退化为“空页面”或“弹窗提示无网络”——离线状态下界面功能完整度必须保持在 80% 以上。
2.2 数据一致性等级
离线场景天然引入最终一致性,但不同业务的写冲突容忍度差异极大。我们按 CRDT + 操作日志 方案定义三个一致性等级:
| 等级 | 名称 | 写冲突处理 | 适用场景 | 同步策略 |
|---|---|---|---|---|
| L1 | 强最终一致 | 服务端最终裁决,客户端乐观更新 | 设备参数(如温度阈值)——误冲突可导致设备误动作 | 每次网络恢复时全量拉取服务端状态 |
| L2 | 可合并一致 | CRDT 自动合并(LWW-Register / RGA) | 巡检记录、文本备注——允许乱序合并 | 增量同步 + 冲突检测 |
| L3 | 弱一致 | 客户端独立写入,服务端以最新时间戳为准 | 浏览历史、用户偏好——丢失可接受 | 批量上传,不做冲突解决 |
数据流与信任链路决策:L1 场景下,信任根始终在服务端,本地修改需附带完整操作前状态哈希;L2 场景下,信任链路为客户端 CRDT → 服务端 CRDT → 持久化,双方互验因果序;L3 场景下,信任模型简化为“客户端为最终生产者,服务端仅做日志存储”。
2.3 网络不稳定性假设
我们采用悲观假设法定义网络的三个状态级别,并以此驱动系统分层与模块职责:
网络状态定义(离线优先专用):
ONLINE : 连续 30s 内 RTT ≤ 200ms,丢包率 ≤ 1%
DEGRADED : RTT 200-800ms,丢包率 1%-5%,或者间歇中断(单次 ≤ 5s)
OFFLINE : 连续 30s 无任何网络响应,或者弱信号下收不到任何 ACK
在此假设下,系统必须支持无感状态切换:
- 网络从 ONLINE 切换到 DEGRADED 时,不阻塞用户操作,仅降低同步频率与并发数。
- 网络切换为 OFFLINE 时,所有网络调用必须由
同步调度器统一接管,切换时间 ≤ 100ms。 - 网络恢复时,
同步引擎应按优先级(L1 → L2 → L3)回放本地操作日志。
选型权衡:为了满足状态切换的时效性,放弃传统的 OkHttp 直连,采用自定义ConnectionManager + 本地 Socket 探测 + 应用层心跳合并。代价是网络层代码复杂度升高,但换来对断续网络的精确感知。
2.4 设备能力约束
目标设备为工业手持终端与加固平板,硬件配置如下:
| 资源项 | 典型值 | 设计约束 |
|---|---|---|
| CPU | 4 核 Cortex-A53 @ 1.2 GHz | 本地 CRDT 合并线程 ≤ 1 个,峰值 CPU 占用 ≤ 40% |
| RAM | 2 GB | 应用常驻内存 ≤ 200 MB(含 SQLite 缓存) |
| 存储 | 16 GB eMMC + 64 GB SD | 离线日志与快照总配额 ≤ 4 GB |
| 电量 | 5000 mAh / 10h 工作 | 同步操作峰值功耗 ≤ 1.5 W,避免触发温控降频 |
这些约束直接影响模块职责划分:
- 数据层必须采用
WAL + 批量提交模式,避免频繁 I/O 抢占 CPU。 - 同步引擎在 DEGRADED 状态下应主动降级:压缩图片(
quality=60%)、合并多条日志、使用ChunkedUpload避免 OOM。 - UI 层不能执行任何 CRDT 合并或文件 IO 操作——这些必须由后台
Worker线程处理,主线程仅负责渲染。
2.5 架构影响总览
将上述需求与约束映射到架构方案关键维度,整理如下:
| 架构维度 | 核心结论 | 对应约束来源 |
|---|---|---|
| 架构边界 | 离线场景全覆盖,只同步依赖在线 | 2.1 离线场景分类 |
| 系统分层 | 明确分离 在线同步层 与 离线应用层 | 2.3 网络状态切换 + 2.4 资源约束 |
| 模块职责 | 数据一致性管理由 ConflictResolver 模块承担,独立于业务逻辑 | 2.2 一致性等级 + 2.4 内存约束 |
| 数据流与信任链路 | L1 场景信任服务端;L2 场景双向验证因果序 | 2.2 一致性等级 |
| 选型权衡 | 放弃标准 HTTP 库,自研 ConnectionManager;使用 CRDT 而非 OCC | 2.3 网络假设 + 2.2 写冲突处理 |
2.6 风险点与权衡
- CRDT 膨胀风险:L2 场景下 CRDT 元数据占用持续增长。落地措施:设定单文档 CRDT 版本上限(5000 次操作后触发 squash)。
- 离线状态与在线状态数据不一致导致的用户困惑:UI 必须在关键字段旁显示
同步状态指示器(如 🟢/🟡/🔴 圆点),并允许手动触发即时同步。 - 设备存储写磨损:频繁的 SQlite WAL 日志 + 图片缓存可能降低 eMMC 寿命。已规划使用
临时文件 + 定期 GC策略,且每天限制总写量 ≤ 500 MB。 - 同步优先级反转:低优先级 L3 数据可能堵住 L1 同步队列。必须实现优先级队列 + 饥饿防止——L1 请求可跳过 L3 待发送队列。
2.7 落地步骤与验收标准
| 步骤 | 操作 | 产出物 |
|---|---|---|
| 1 | 绘制完整离线场景矩阵(含异常路径) | 离线场景需求文档 v1.0 |
| 2 | 定义每个场景的数据一致性等级和 CRDT 类型 | 一致性等级决策表 |
| 3 | 编写网络状态切换 mock 测试桩(模拟 ONLINE → DEGRADED → OFFLINE) | 网络状态模拟库 + 测试用例 |
| 4 | 基于设备能力约束评估框架:内存、CPU、存储各设置预警阈值 | 资源约束检查清单 |
| 5 | 将本章输出正式合并到架构设计文档的“约束与假设”章节 | 架构设计 v0.2 |
验收标准:
- 三种离线场景均能在
mock OFFLINE状态下完成核心功能且无崩溃。 - L1、L2、L3 数据在同步后一致性等级满足定义(测试脚本自动验证)。
- 网络状态切换感知延迟 ≤ 150ms(从实际断网到应用层切换)。
- 在所有约束条件下,应用内存峰值 ≤ 220 MB,CPU 占用 ≤ 45%。
架构决策记录:本章得出的约束将被视为“不可变更的硬条件”。任何后续架构改动如果导致内存超限、网络切换延迟超标或一致性等级降级,必须通过变更评审。