在准备软考系统架构设计师的过程中,除了掌握核心的架构模式、设计原则和常用技术之外,往往容易忽略一些零散的、但又非常重要的杂项知识点。本文聚焦这些易错点,结合实际案例,力求帮助大家在考场上避免踩坑。软考系统架构设计师系列知识点之杂项集萃是本篇的重点,我们来逐一击破。
缓存穿透、击穿与雪崩
缓存是架构设计中必不可少的一环,但如果使用不当,反而会引发一系列问题,其中最常见的就是缓存穿透、击穿和雪崩。
缓存穿透(Cache Penetration):指查询一个不存在的数据,由于缓存中没有该数据,请求会直接穿透缓存到达数据库。如果大量请求查询不存在的数据,会对数据库造成巨大的压力。

解决方案:
- 缓存空对象:当数据库查询为空时,仍然将空对象缓存起来,设置较短的过期时间。
- 布隆过滤器:在缓存之前使用布隆过滤器进行过滤,如果布隆过滤器判断数据不存在,则直接返回,避免请求到达缓存。
# Python 示例:使用 redisbloom 库实现布隆过滤器 import redis from redisbloom.client import BloomFilter # 连接 Redis r = redis.Redis(host='localhost', port=6379, db=0) bf = BloomFilter(r, 'user_id_bloom') # 初始化布隆过滤器(假设有 100000 个用户,误差率为 0.01) bf.create('user_id_bloom', 100000, 0.01) # 添加用户 ID 到布隆过滤器 user_ids = [1, 2, 3, 4, 5] for user_id in user_ids: bf.add('user_id_bloom', user_id) # 检查用户 ID 是否存在 print(bf.exists('user_id_bloom', 1)) # True print(bf.exists('user_id_bloom', 10)) # False
缓存击穿(Cache Breakdown):指一个热点 Key 在缓存中过期,此时大量请求同时访问该 Key,导致这些请求直接穿透缓存到达数据库。因为只有一个请求会成功更新缓存,其余请求全部去查询数据库,对数据库造成压力。

- 解决方案:
- 互斥锁:在第一个请求到达数据库时,使用互斥锁(例如 Redis 的 SETNX 命令)锁定该 Key,防止其他请求同时访问数据库。第一个请求更新缓存后,释放锁,允许其他请求访问缓存。
- 永不过期:不设置过期时间或者设置逻辑过期时间,由后台线程异步更新缓存。
- 解决方案:
缓存雪崩(Cache Avalanche):指缓存中大量 Key 同时过期,导致大量请求直接穿透缓存到达数据库。例如,大量 Key 的过期时间被设置为相同的时间,或者缓存服务器宕机。
- 解决方案:
- 过期时间随机化:为 Key 设置过期时间时,增加一个随机数,避免大量 Key 同时过期。
- 多级缓存:使用多级缓存,例如本地缓存(Guava Cache) + 分布式缓存(Redis),降低缓存雪崩的风险。
- 服务熔断/限流:当数据库压力过大时,可以采取服务熔断或限流的措施,保护数据库。
- 解决方案:
分布式事务的几种常见解决方案
分布式事务是分布式系统设计中的一个难点。在微服务架构下,一个业务操作可能需要跨多个服务,如何保证数据的一致性是一个挑战。
- 2PC(Two-Phase Commit):两阶段提交协议。事务管理器协调所有参与者,先尝试预提交,所有参与者都准备好后,再正式提交。如果任何一个参与者预提交失败,则所有参与者都回滚。
- 缺点:性能较差,存在单点故障风险。
- TCC(Try-Confirm-Cancel):Try 阶段尝试执行业务,Confirm 阶段确认执行,Cancel 阶段取消执行。每个阶段都需要开发人员自己实现。
- 优点:性能较好,适用于对一致性要求较高的场景。
- 缺点:开发难度较大,需要考虑各种异常情况。
- 本地消息表:业务操作和消息发送在同一个事务中,确保消息一定会被发送到消息队列。消费者从消息队列中获取消息,执行业务操作。
- 优点:实现简单,适用于对最终一致性要求较高的场景。
- 缺点:需要额外的消息表,增加了数据库的负担。
- Seata:一款开源的分布式事务解决方案,支持 AT、TCC、SAGA 等多种模式。
Nginx 调优与常见配置
Nginx 作为一款高性能的反向代理服务器,在系统架构中扮演着重要的角色。合理的配置和调优可以显著提升系统的性能。
worker_processes:设置 worker 进程的数量,一般设置为 CPU 核心数。

worker_connections:设置每个 worker 进程的最大连接数。
keepalive_timeout:设置长连接的超时时间。
gzip:开启 gzip 压缩,减少网络传输量。
# Nginx 配置示例 worker_processes auto; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; gzip on; gzip_disable "msie6"; # ... 其他配置 }
总结与展望
软考系统架构设计师的备考是一个系统工程,不仅需要掌握核心的架构知识,还需要关注这些容易被忽略的杂项知识点。希望本文能够帮助大家在备考过程中查漏补缺,顺利通过考试。在实际工作中,结合实际场景,选择合适的技术方案才是最重要的。 学习是一个循序渐进的过程,需要不断地积累和实践。祝大家备考顺利!
冠军资讯
键盘上的咸鱼