并发访问场景分类:读多写少、写多读少、读写均衡

并发访问场景的读写比例是模块边界设计的第一位输入。不同比例决定了锁粒度、缓存策略、存储选型甚至模块拆分的核心逻辑。本章按读/写操作占比将场景分为三类,并依次分析每类场景下的模块边界划分、组件职责、数据流与控制流特征,最后给出选型权衡、风险点、落地步骤与验收标准。

2.1 三类场景的宏观特征

场景类别读操作占比写操作占比典型业务举例
读多写少> 80%< 20%内容管理系统、商品详情页、配置中心
写多读少< 20%> 80%日志采集、传感器数据写入、订单流水记录
读写均衡40% – 60%40% – 60%社交 Feed、即时通讯消息同步、在线文档协作

2.2 读多写少场景

模块边界与组件职责:数据访问层与缓存层之间的边界清晰,读操作穿透到数据库前必须经过本地/分布式缓存。典型组件:只读副本、CDN、本地堆缓存、预计算视图。

数据流与控制流:读请求走 应用 → 缓存(命中则返回)→ 数据库+写回缓存;写请求走 应用 → 主库写入 → 缓存失效/更新。控制流重点在缓存失效策略(LRU、TTL、主动失效)和读写锁降级。

关键权衡:缓存容量与一致性的取舍。强一致性要求写后读必须命中最新值,此时需改用读写锁或分布式同步锁;若允许最终一致性,则可采用旁路缓存+异步失效。

2.3 写多读少场景

模块边界与组件职责:写入端采用批量提交、异步缓冲、日志结构化合并。读操作通常只用于事后回放或统计,不要求实时性。典型组件:消息队列、LSM-Tree 存储、预写日志(WAL)、写入缓冲池。

风险点:写放大(LSM 的 compaction)、写磁盘 I/O 瓶颈、背压(backpressure)处理不当导致 OOM。模块边界需隔离写入链路与读链路,防止写入抖动影响读取。

数据流与控制流:写入请求进入消息队列或缓冲层后,由批量写入器刷入存储层。读取请求走独立只读副本或快照读,避免与正在合并的数据产生锁竞争。控制流重点在流控策略(令牌桶、滑动窗口)和 compaction 调度。

2.4 读写均衡场景

模块边界与组件职责:读写路径高度交织,支持事务与乐观锁。典型组件:分布式事务协调器、乐观锁(版本号/CAS)、行级锁、多版本并发控制(MVCC)。模块边界内常出现读写冲突仲裁逻辑,边界外采用无锁数据结构或写时复制。

数据流与控制流:读操作需要获取一致性快照(MVCC 版本),写操作需要提交前检查版本冲突。控制流核心是锁升级策略与死锁检测。常见风险:长事务导致版本垃圾堆积、乐观锁冲突频繁导致写失败率高。

落地步骤建议:优先验证业务中读写冲突概率;若冲突率 > 15%,应考虑行锁或分布式锁而不是纯乐观锁;写入密集时需分离热点 key。

2.5 三类场景的架构选型矩阵

维度读多写少写多读少读写均衡
推荐并发控制模型读写锁(读写分离)批量提交+缓冲队列乐观锁 + MVCC
缓存策略强缓存(写后失效)弱缓存或无缓存读缓存 + 写合并
存储选型MySQL + RedisLSM-Tree(HBase、LevelDB)TiDB、CockroachDB
模块边界粒度按数据域划分副本组按写入分区划分 ingest 节点按实体事务边界划分分片
关键验收指标读吞吐 QPS / 缓存命中率写入延迟 P99 / 写入吞吐量读写冲突率 / 事务成功率

2.6 并发场景分类决策流程

下图展示了从业务流量特征到架构决策的核心路径,帮助架构师快速判断当前场景属于哪一类并选择对应的并发控制策略。

并发访问场景分类决策流程 读写比例统计 读 > 80% 读多写少 → 读写锁 + 缓存 写 > 80% 写多读少 → 批量 + LSM 均 < 60% 读写均衡 → 乐观锁 + MVCC 缓存层模块边界 旁路缓存 OR 透写? 只读副本 + 读写分离 控制流:缓存失效通知 写入缓冲边界 MQ OR 内存 buffer? 批量提交 + 预写日志 控制流:背压 & compaction 事务隔离边界 行锁 OR 乐观锁? MVCC快照 + 版本检查 控制流:冲突检测 & 重试 落地步骤摘要 ① 采集线上流量读写比 ② 按比例定位场景类别 ③ 选择锁模式与缓存策略 ④ 定义模块边界(数据域/写入分区/事务分片) ⑤ 压测验证冲突率与吞吐

2.7 风险点与落地步骤

读多写少常见风险:缓存击穿(热点 key 过期时大量请求穿透至 DB)、缓存雪崩(大量 key 同时过期)。
写多读少常见风险:背压导致的写入积压、compaction 期间磁盘 IO 飙升影响延迟。
读写均衡常见风险:乐观锁冲突概率随并发升高而激增,长事务版本残留导致存储膨胀。

落地步骤(通用)

  1. 流量采集:通过监控或请求采样获取真实读写比例与延迟分布。
  2. 场景分类:按 2.1 节表格判断类别,若读写比不明确则按峰值场景容错设计。
  3. 模块边界定义:根据类别画出数据流与控制流图,确定缓存层/写入缓冲层/事务层插入位置。
  4. 组件选型:参考 2.5 节矩阵选择具体中间件与并发原语。
  5. 压测验证:使用生产流量比例进行压力测试,验收指标参照下节。

验收标准

  • 读多写少:系统在读 QPS 达到目标值时,缓存命中率 ≥ 95%,写后读延迟 ≤ 5ms。
  • 写多读少:写入 P99 延迟 ≤ 50ms,写入吞吐达到目标值且背压未导致 reject 率 > 0.1%。
  • 读写均衡:事务冲突率 ≤ 10%,事务平均完成时间 ≤ 100ms,无死锁或超时死锁。
  • 所有场景:模块边界内的故障隔离有效,单一组件崩溃不影响另一侧的读写路径。