经典架构模式
这篇解决什么问题
经典架构模式是面对高并发、高可用、复杂业务时反复出现的解决方案集合。
这类主题通常不是单个工具或单条命令能讲清楚的,它更像一组工程约定:先明确问题边界,再选择合适模型、格式、流程或架构,最后通过测试、日志、指标和复盘确认方案真的可靠。
核心概念
| 概念 | 说明 |
|---|---|
| 缓存模式 | 旁路缓存、读穿、写穿、写回,各自影响一致性和延迟。 |
| 分库分表 | 把数据按规则拆分,解决单库容量和吞吐瓶颈,但增加查询复杂度。 |
| 消息队列 | 削峰填谷、异步解耦,但要处理重复消费、顺序和失败补偿。 |
| 读写分离 | 读请求走从库,写请求走主库,需要关注复制延迟。 |
| CQRS | 命令模型和查询模型分离,适合读写差异很大的系统。 |
| 事件驱动 | 用事件表达状态变化,适合跨系统协作和异步流程。 |
它是怎么工作的
可以按四步理解:
- 识别对象:先确认要管理的是数据、接口、配置、请求、模型、流程还是团队协作。
- 建立契约:用 schema、接口规范、流程文档、测试用例或权限规则把隐含约定显式化。
- 执行与观测:让系统在真实运行中留下可追踪的证据,包括日志、指标、调用链、审计记录和变更记录。
- 反馈修正:根据错误、性能、成本和维护体验持续调整,而不是一次设计后永远不改。
这也是工程知识和纯概念知识最大的区别:概念本身不难,难的是在真实约束下做取舍,并且能证明选择是有效的。
关键设计问题
| 问题 | 为什么重要 |
|---|---|
| 边界在哪里 | 边界不清会导致职责扩散,后续维护困难 |
| 谁是调用方或使用者 | 不同使用者对可读性、性能、稳定性和权限的要求不同 |
| 失败时会怎样 | 没有失败模型,就无法设计重试、回滚、降级和告警 |
| 数据或状态是否会演进 | 版本兼容、迁移和历史数据处理往往比首次实现更难 |
| 如何验证 | 没有验证手段,AI 生成或人工设计都只能停留在“看起来合理” |
| 成本在哪里 | 成本包括机器资源、人力、认知负担和长期维护 |
开发中的真实场景
- 先识别问题属于配置、接口、数据、运行时、架构还是协作层面。
- 明确输入、输出、约束、失败模式和验收标准。
- 对关键路径保留日志、测试和文档,避免只靠口头经验传递。
- 遇到跨系统问题时,优先用事实链路排查,而不是按经验猜测。
- 当方案涉及多人协作时,把命名、目录、字段、错误码、权限和发布流程写成明确约定。
实践清单
- 写下当前问题的一句话目标。
- 列出输入、输出、依赖和不处理的范围。
- 明确正常路径、异常路径和边界条件。
- 为关键约定补充示例,而不是只写抽象定义。
- 能自动化验证的部分尽量放进测试、脚本或 CI。
- 不能自动化的部分保留人工验收清单。
- 变更后记录原因,避免后续只看到结果看不到取舍。
AI Coding 时代怎么用
- 让 AI 先解释现有系统中的相关约定,再要求它改动。
- 给出真实上下文:文件路径、配置、日志、接口样例和约束。
- 要求 AI 明确风险、边界和验证命令。
- 对高风险改动,坚持小步提交、测试验证和人工审查。
- 不要让 AI 在缺少上下文时自由发明标准;先让它读取现有文档、代码和配置。
- 对 AI 输出的术语、命令、配置和接口字段做事实校验。
常见误区
- 只记工具名,不理解工具解决的问题。
- 只追求通用性,提前做复杂抽象。
- 把 AI 生成的内容当成事实,缺少代码、测试或运行结果验证。
- 只写成功路径,不设计失败、重试、回滚和权限边界。
- 把文档当作交付物,而不是把文档当作团队协作的接口。
验证方式
- 能否用一个真实例子走完整条链路。
- 能否解释一个常见失败案例以及排查步骤。
- 能否指出这个方案不适合哪些场景。
- 能否通过测试、日志、指标、审计或人工 checklist 证明它在工作。
小结
经典架构模式 的重点不是背术语,而是理解它在真实工程链路中解决什么问题、带来什么约束,以及如何验证方案是否可靠。