推荐阅读
- 先从需求与约束出发做架构分层
- 再看核心组件、数据流与边界
- 最后看扩展性、成本与演进策略
副标题 / 摘要 性能关注“当前快不快”,可扩展性关注“增长后还能否保持”。本文拆解两者关系与常见误区。 目标读者 负责性能与扩展性决策的工程师 做容量规划与架构设计的团队 经常被“性能优化”困扰的开发者 背景 / 动机 很多系统在小规模很快,但规模一上来就崩。 因为性能优化和可扩展性是不同维度,需要不同策略。 核心概念 性能:单点/单实例的响应与吞吐 可扩展性:负载增加后系统维持服务能力 瓶颈:CPU / IO / 网络 / 数据库 规模曲线:负载增加时性能曲线是否线性 实践指南 / 步骤 先测基线性能(单机极限) 观察扩展曲线(1x -> 2x -> 4x) 定位瓶颈组件 区分纵向与横向扩展策略 用容量规划指导架构 可运行示例 # 伪负载模型:用简单函数模拟扩展曲线 def capacity(instances, single_qps, overhead=0.1): return instances * single_qps * (1 - overhead) if __name__ == "__main__": for n in [1, 2, 4, 8]: print(n, capacity(n, 1000)) 解释与原理 性能是“单位资源的效率”,可扩展性是“资源增加后效率是否保持”。 如果瓶颈在共享组件(如数据库),扩容应用实例并不会线性提升整体性能。 常见问题与注意事项 性能好就代表可扩展吗? 不一定,可能只是单点强。 扩展性差就需要重构吗? 不一定,先定位瓶颈。 缓存能解决扩展性问题吗? 只能缓解部分读压力。 最佳实践与建议 用压测画出扩展曲线 关注共享瓶颈(DB、锁、网络) 设计可扩展性优先的系统边界 小结 / 结论 性能解决“当前快”,可扩展性解决“增长后还能快”。 两者相关但不等价,必须分别优化。 ...
副标题 / 摘要 缓存不是万能的,有时甚至危险。本文解释缓存带来的风险场景,并给出规避策略。 目标读者 负责架构选型的工程师 需要平衡一致性与性能的团队 经常做缓存优化的开发者 背景 / 动机 “加缓存”几乎是所有性能问题的第一反应,但在强一致性场景中,缓存可能带来严重业务风险。 理解何时不该缓存,和如何安全缓存一样重要。 核心概念 一致性风险:缓存与源数据不一致 失效策略:主动失效 / TTL / 事件驱动 读写比例:决定缓存收益 错误放大:错误缓存比错误计算更危险 实践指南 / 步骤 判断一致性要求(金融、库存、权限等) 识别可容忍的延迟 选择失效策略(TTL/主动清理) 对关键字段禁用缓存 建立缓存监控与熔断 可运行示例 cache = {} def get_price(product_id): if product_id in cache: return cache[product_id] price = 100 # 假设从数据库读取 cache[product_id] = price return price 解释与原理 缓存只在“读多写少、可容忍延迟”的场景下安全。 如果业务对一致性敏感,缓存会放大错误并导致不可控后果。 常见问题与注意事项 缓存一定提升性能吗? 不一定,缓存失效或穿透时成本更高。 TTL 足够吗? 不一定,某些场景需要事件驱动失效。 缓存和幂等有什么关系? 幂等能降低缓存错误带来的二次风险。 最佳实践与建议 对“强一致性”业务谨慎缓存 缓存前先定义失效策略 监控命中率与错误率 小结 / 结论 缓存是性能工具,不是默认选项。 在强一致性与高风险业务中,缓存反而可能危险。 参考与延伸阅读 Cache Invalidation 技术讨论 Redis 缓存最佳实践 分布式一致性案例 元信息 阅读时长:7~9 分钟 标签:缓存、架构、一致性 SEO 关键词:缓存, Cache Invalidation, 一致性 元描述:说明缓存何时危险并给出规避策略。 行动号召(CTA) 列出你系统中最不能容忍错误的字段,明确哪些绝对不能缓存。
副标题 / 摘要 Web 与桌面应用的容错目标不同:Web 更关注高可用与多副本,桌面更关注本地恢复与数据完整性。本文给出对比与实践建议。 目标读者 负责跨端系统设计的工程师 需要制定容错策略的技术负责人 关注可靠性与用户体验的开发者 背景 / 动机 同样是“容错”,Web 关心的是“服务不中断”,桌面关心的是“用户不丢数据”。 如果把 Web 的策略照搬到桌面,或反之,效果往往不佳。 核心概念 Web 容错:多副本、负载均衡、熔断、降级 桌面容错:本地事务、自动恢复、崩溃保护 状态管理:无状态 vs 有状态 实践指南 / 步骤 明确容错目标:可用性、数据完整性、体验连续性 Web 端优先无状态,用多副本与自动扩缩容 桌面端优先保护本地状态(自动保存、崩溃恢复) 建立错误分级:可重试、可降级、必须失败 跨端一致性:必要时用同步/冲突解决策略 可运行示例 下面展示桌面应用“自动保存”的最小示例: import json import time state = {"text": "draft"} def autosave(state, path="autosave.json"): with open(path, "w") as f: json.dump(state, f) if __name__ == "__main__": for i in range(3): state["text"] += "!" autosave(state) time.sleep(0.1) print("saved") 解释与原理 Web 服务通过多副本与负载均衡保证“任一实例失败不影响整体”。 桌面应用无法依赖多副本,只能通过本地持久化与恢复机制容错。 ...