需求澄清
系统设计面试第一步是澄清需求,避免过度设计或遗漏关键点。
功能需求:核心功能有哪些?MVP 范围?哪些是 P0?例如设计短链服务,需明确:生成、跳转、统计、过期是否必需。
非功能需求:预期 QPS、P99 延迟、可用性目标(如 99.99%)、一致性要求(强一致 vs 最终一致)。
规模估算:日活、数据量、读写比例。用于后续选型:单机够不够?需要分库分表吗?
约束:技术栈偏好、预算、合规要求等。
分层与模块划分
接入层:负载均衡、限流、鉴权。LB 将流量分发到多台应用服务器。
服务层:无状态业务逻辑,可水平扩展。按领域拆分微服务,避免单体臃肿。
数据层:数据库选型(关系型 vs NoSQL)、缓存(Redis)、消息队列(Kafka)。根据读写特点选择:高并发读用缓存,异步解耦用 MQ。
存储选型:关系型适合强一致、复杂查询;KV 适合简单读写、高 QPS;搜索引擎适合全文检索;时序库适合监控指标。
高可用与扩展
冗余:无单点,关键组件多副本。数据库主从、Redis 集群、多机房部署。
故障转移:健康检查 + 自动摘除故障节点;主从切换(手动或自动)。需考虑脑裂、数据一致性。
扩展:水平扩展(加机器)优于垂直扩展(升配)。无状态服务易扩展;数据库需分库分表、读写分离。
降级与熔断:非核心功能可降级;依赖故障时熔断,避免雪崩。