web系统设计
发帖时间:2026-10-17 05:11:18
Web系统设计是统设一场与复杂性对抗的持久战。我参与过的统设一个项目,初期团队信心满满画了张漂亮的统设架构图,模块划分清晰,统设接口定义完备。统设上线三个月后,统设那张图就成了一堆没人敢动的统设废纸。业务逻辑开始渗透进每个角落,统设定时任务和用户请求抢数据库连接,统设缓存穿透把后端打得喘不过气。统设那张图没有错,统设错在我们把设计当成了静态的统设交付物,而不是统设动态的演进过程。 真正核心的统设设计原则,是统设让系统能够优雅地变老。数据库表设计时多问一句“这个字段未来会不会变成多值”,可能就省掉一次灾难性的迁移。接口定义时考虑兼容性,哪怕多写个冗余参数,也比日后强迫所有调用方升级要好。这些都不是什么高深理论,是血泪教训换来的习惯。 分层架构被说烂了,但多数系统根本没分对层。常见的错误是把业务逻辑塞进Controller,或者让Service层直接操作具体数据库实现。我见过一个项目,为了“灵活”直接在各处使用原生SQL,结果业务规则散落一地,改一个需求要动十几个文件。好的分层应该像洋葱,每层只知道自己下面那层,不知道更深的细节。这跟代码行数无关,是依赖方向的问题。 缓存是双刃剑,这个谁都知道,但用的好的人极少。缓存不光是性能优化手段,更是系统可用性的缓冲垫。数据库扛不住峰值流量时,缓存是最后的防线。但缓存失效瞬间的雪崩,以及数据一致性在极端情况下的取舍,需要设计者提前想清楚。我倾向于把缓存当作有损的临时存储,而不是可靠的副本。这种心态下,设计出来的系统自然会在缓存和数据库之间设置合理的兜底策略。 异步化是应对突发流量的关键武器。同步调用链一旦超过三个环节,整体延迟和失败概率就难以控制。把非核心链路拆出去,用消息队列削峰填谷,系统能承受的冲击会提升一个量级。但异步也带来分布式事务的头痛问题。最终一致性方案需要业务方接受短暂的延迟窗口,这需要产品经理和工程师共同理解技术约束。没有这种共识,异步化方案迟早会被业务需求逼回同步模式。 监控和可观测性不是后期补丁,而是设计的组成部分。系统上线后,你是否能回答“现在哪个接口最慢”、“哪条SQL扫了多少行”、“消息积压了多少条”这些问题?回答不了,就是盲人摸象。设计阶段就要定义关键指标和日志规范,把traceId贯穿全链路。没有这些,排查问题就像在黑暗里找一根掉落的针。 系统设计的本质是取舍的艺术。一致性、可用性、分区容错性三者不可兼得,你必须根据业务场景明确优先级。金融系统要强一致,社交软件更能容忍短暂不一致。这种判断没有标准答案,依赖设计者对业务本质的理解。别迷信那些炫技的方案,很多时候最简单的方案就是最合适的。一个能稳定运行三年的单体架构,可能比一个每天出状况的微服务集群更有价值。 设计文档不用写太长,但必须记录决策背后的理由。为什么选这个中间件,为什么不用另一个方案,当时权衡了哪些因素。这些内容比最终架构图珍贵得多。半年后新人接手,看这些记录能快速进入状态,而不是对着代码猜设计意图。我见过太多团队把设计评审会开成形式主义的走过场,没人真正质疑和挑战方案。好的设计需要激烈的争论,需要有人拍桌子问“如果这个节点挂了怎么办”,需要有人扮演魔鬼代言人。这种碰撞出来的方案,才经得起真实流量的考验。