
1) 【一句话结论】我参与的投放系统从单体架构演进到微服务架构,核心是为了突破单体系统的扩展瓶颈(如数据库连接池耗尽、CPU满载导致性能下降),通过按业务能力拆分服务(用户、创意、策略、统计服务),依据领域驱动设计(DDD)的子域划分作为拆分边界,采用Saga模式处理数据一致性,借助Nacos注册发现、Hystrix熔断等工具解决服务治理问题,最终实现用户服务QPS从1万提升至5万,故障恢复时间缩短至30秒以内。
2) 【原理/概念讲解】老师口吻解释:单体架构是将所有业务模块(用户管理、广告创意、投放策略、数据统计)部署在单一应用内,共享数据库。当用户量增长时,会出现扩展瓶颈:比如数据库连接池耗尽(连接数达到最大值,新请求被拒绝,因为所有连接都在使用,无法获取新连接),CPU利用率100%(业务逻辑中,策略服务需要实时计算投放规则,包含大量数学运算,如线性回归、权重调整,导致CPU占用率持续在95%以上),响应时间超时(用户点击投放按钮后,等待结果时间过长,影响用户体验)。微服务架构则是将系统拆分为多个独立服务,每个服务负责单一业务能力(如用户服务仅处理用户信息、权限验证;创意服务仅管理广告素材、模板;策略服务仅生成投放规则、缓存策略;统计服务仅记录投放数据、分析指标),独立部署、独立开发、独立扩展,服务间通过轻量级通信(HTTP/REST或消息队列)交互。类比:单体像“一个装满所有食材的大锅,加热时所有食材都受热,调整某食材(如增加盐)需要动整个锅,所有食材都受影响;微服务像多个小锅,每个小锅负责特定食材(如汤锅、菜锅),可以单独调整每个锅的温度(如汤锅加火,菜锅保持温度),互不干扰,加热效率更高,且调整某食材只需动对应的小锅。”
3) 【对比与适用场景】
| 特性/维度 | 单体架构 | 微服务架构 | 注意点 |
|---|---|---|---|
| 定义 | 所有模块部署在单一应用内,共享数据库 | 系统拆分为多个独立服务,每个服务负责单一业务能力 | 微服务需考虑服务治理(注册发现、熔断等) |
| 扩展性 | 整体扩展,难以针对特定模块 | 针对特定服务扩展,资源利用率高 | 需评估服务拆分粒度,避免过度拆分 |
| 数据管理 | 共享数据库,事务复杂(如全量事务) | 每服务独立数据库,需分布式事务方案(如Saga) | 数据一致性是关键挑战 |
| 开发与部署 | 整体开发,部署一次 | 模块化开发,服务独立部署(Docker容器化) | 部署复杂度增加,需自动化部署工具 |
| 通信方式 | 内部调用(低延迟,强耦合) | 服务间调用(HTTP同步或消息队列异步) | 异步通信可解耦,但需消息队列保证可靠性 |
| 适用场景 | 小规模系统(<100人团队,用户量<10万,业务单一) | 复杂系统(>100人团队,用户量>100万,多团队协作,业务复杂) | 需平衡复杂度与收益,考虑团队协作成本 |
4) 【示例】
假设投放系统原本是单体应用,用户量增长至10万时出现瓶颈:数据库连接池耗尽(连接数1000,实际请求量1.2万/秒,导致新请求被拒绝,错误码“连接池耗尽”),CPU利用率100%(业务逻辑中,策略服务实时计算投放规则导致CPU占用过高),响应时间超时(800ms,用户点击投放按钮后,等待结果时间过长,影响用户体验)。演进过程:
投放请求 → 单体应用(用户服务查询用户信息 + 创意服务获取素材 + 策略服务生成规则 + 统计服务记录)(依赖共享MySQL数据库,模块间强耦合,用户服务查询用户信息时,连接池耗尽导致请求失败;策略服务计算规则时,CPU占用100%,导致响应超时)。5) 【面试口播版答案】(约90秒)
“面试官您好,我参与的投放系统从单体架构演进到微服务架构,核心是为了解决单体系统的扩展瓶颈。最初系统是单体部署,所有模块(用户管理、广告创意、投放策略、数据统计)共享数据库,当用户量增长到10万时,出现数据库连接池耗尽(连接数1000,实际请求量1.2万/秒,新请求被拒绝)、CPU利用率100%(策略服务实时计算投放规则导致CPU占用过高)、响应时间超时(800ms)的问题。演进过程中,我们按业务能力拆分服务,依据领域驱动设计(DDD)的子域划分:用户管理(核心子域)拆为用户服务(独立MySQL数据库),广告创意(核心子域)拆为创意服务(独立MongoDB),投放策略(支撑子域)拆为策略服务(Redis+MySQL),数据统计(支撑子域)拆为统计服务(InfluxDB)。拆分原则是‘单一职责’,数据一致性用Saga模式处理(用户信息变更后,创意服务通过消息队列(Kafka)执行更新,失败则补偿回滚,确保数据最终一致)。服务治理用Nacos注册发现(配置服务地址,动态更新服务列表),Hystrix设置熔断阈值(失败率>50%触发,隔离故障服务,避免级联故障)。最终,用户服务QPS从1万提升至5万,故障恢复时间缩短至30秒,系统可扩展性和稳定性显著提升。”
6) 【追问清单】
7) 【常见坑/雷区】