并发访问场景分类:读多写少、写多读少、读写均衡
并发访问场景的读写比例是模块边界设计的第一位输入。不同比例决定了锁粒度、缓存策略、存储选型甚至模块拆分的核心逻辑。本章按读/写操作占比将场景分为三类,并依次分析每类场景下的模块边界划分、组件职责、数据流与控制流特征,最后给出选型权衡、风险点、落地步骤与验收标准。
2.1 三类场景的宏观特征
| 场景类别 | 读操作占比 | 写操作占比 | 典型业务举例 |
|---|---|---|---|
| 读多写少 | > 80% | < 20% | 内容管理系统、商品详情页、配置中心 |
| 写多读少 | < 20% | > 80% | 日志采集、传感器数据写入、订单流水记录 |
| 读写均衡 | 40% – 60% | 40% – 60% | 社交 Feed、即时通讯消息同步、在线文档协作 |
2.2 读多写少场景
模块边界与组件职责:数据访问层与缓存层之间的边界清晰,读操作穿透到数据库前必须经过本地/分布式缓存。典型组件:只读副本、CDN、本地堆缓存、预计算视图。
数据流与控制流:读请求走 应用 → 缓存(命中则返回)→ 数据库+写回缓存;写请求走 应用 → 主库写入 → 缓存失效/更新。控制流重点在缓存失效策略(LRU、TTL、主动失效)和读写锁降级。
2.3 写多读少场景
模块边界与组件职责:写入端采用批量提交、异步缓冲、日志结构化合并。读操作通常只用于事后回放或统计,不要求实时性。典型组件:消息队列、LSM-Tree 存储、预写日志(WAL)、写入缓冲池。
数据流与控制流:写入请求进入消息队列或缓冲层后,由批量写入器刷入存储层。读取请求走独立只读副本或快照读,避免与正在合并的数据产生锁竞争。控制流重点在流控策略(令牌桶、滑动窗口)和 compaction 调度。
2.4 读写均衡场景
模块边界与组件职责:读写路径高度交织,支持事务与乐观锁。典型组件:分布式事务协调器、乐观锁(版本号/CAS)、行级锁、多版本并发控制(MVCC)。模块边界内常出现读写冲突仲裁逻辑,边界外采用无锁数据结构或写时复制。
数据流与控制流:读操作需要获取一致性快照(MVCC 版本),写操作需要提交前检查版本冲突。控制流核心是锁升级策略与死锁检测。常见风险:长事务导致版本垃圾堆积、乐观锁冲突频繁导致写失败率高。
2.5 三类场景的架构选型矩阵
| 维度 | 读多写少 | 写多读少 | 读写均衡 |
|---|---|---|---|
| 推荐并发控制模型 | 读写锁(读写分离) | 批量提交+缓冲队列 | 乐观锁 + MVCC |
| 缓存策略 | 强缓存(写后失效) | 弱缓存或无缓存 | 读缓存 + 写合并 |
| 存储选型 | MySQL + Redis | LSM-Tree(HBase、LevelDB) | TiDB、CockroachDB |
| 模块边界粒度 | 按数据域划分副本组 | 按写入分区划分 ingest 节点 | 按实体事务边界划分分片 |
| 关键验收指标 | 读吞吐 QPS / 缓存命中率 | 写入延迟 P99 / 写入吞吐量 | 读写冲突率 / 事务成功率 |
2.6 并发场景分类决策流程
下图展示了从业务流量特征到架构决策的核心路径,帮助架构师快速判断当前场景属于哪一类并选择对应的并发控制策略。
2.7 风险点与落地步骤
写多读少常见风险:背压导致的写入积压、compaction 期间磁盘 IO 飙升影响延迟。
读写均衡常见风险:乐观锁冲突概率随并发升高而激增,长事务版本残留导致存储膨胀。
落地步骤(通用)
- 流量采集:通过监控或请求采样获取真实读写比例与延迟分布。
- 场景分类:按 2.1 节表格判断类别,若读写比不明确则按峰值场景容错设计。
- 模块边界定义:根据类别画出数据流与控制流图,确定缓存层/写入缓冲层/事务层插入位置。
- 组件选型:参考 2.5 节矩阵选择具体中间件与并发原语。
- 压测验证:使用生产流量比例进行压力测试,验收指标参照下节。
验收标准
- 读多写少:系统在读 QPS 达到目标值时,缓存命中率 ≥ 95%,写后读延迟 ≤ 5ms。
- 写多读少:写入 P99 延迟 ≤ 50ms,写入吞吐达到目标值且背压未导致 reject 率 > 0.1%。
- 读写均衡:事务冲突率 ≤ 10%,事务平均完成时间 ≤ 100ms,无死锁或超时死锁。
- 所有场景:模块边界内的故障隔离有效,单一组件崩溃不影响另一侧的读写路径。