51mee - AI智能招聘平台Logo
模拟面试题目大全招聘中心会员专区

设计一个支持百万级用户同时访问的旅游零售(免税)电商系统,需要考虑哪些核心架构设计?请详细说明缓存、数据库、消息队列等组件的选型与部署策略。

中国旅游集团战略类岗位(管培生)难度:中等

答案

1) 【一句话结论】
支撑百万级用户访问的旅游零售电商系统,需构建“请求分片+分层缓存(含雪崩/穿透/击穿应对)+分库分表(含分表键设计)+异步解耦(消息队列幂等性保障)+服务治理(Nacos注册发现)+多机房容灾”的分布式架构,通过负载均衡、CDN、多机房部署实现高并发承载与低延迟,同时保障数据一致性与系统稳定性。

2) 【原理/概念讲解】
讲解高并发系统核心逻辑:

  • 请求分片:按用户ID、商品ID等维度分散请求,避免单点压力(类比:把大任务拆成小任务,分给不同工人,避免一个工人忙死)。
  • 分层缓存:本地缓存(应用内Redis实例)存储高频访问数据(如商品列表、用户信息),响应时间<1ms;分布式缓存(Redis集群)共享热点数据,集群部署(主从+哨兵)保障高可用,缓存雪崩(大量缓存过期,请求集中到数据库)应对:随机过期时间;缓存穿透(查询不存在的数据,数据库压力)应对:布隆过滤器(预过滤不存在的数据);缓存击穿(热点数据缓存过期,数据库压力)应对:Redis分布式锁(只允许一个请求查询数据库并更新缓存,其他请求等待)。
  • 数据库分库分表:垂直分库按业务模块(商品、订单、用户)拆分,水平分表按商品分类哈希分表(如商品ID % 100取模,分100张表),解决单库连接数(每个库连接数1000,总连接数1万)和存储瓶颈(单表数据量超亿),读写分离(主库写,从库读)提升读性能。
  • 消息队列解耦:用Kafka处理订单、库存等异步任务,下单后推入Kafka,消费者异步扣减库存、更新订单状态,消费者幂等性保障:通过消息唯一标识(如订单ID),消费时检查数据库状态表(如订单状态表),若已处理则跳过,避免重复处理。
  • 服务治理:API网关(如Nginx)做负载均衡、熔断降级,服务注册发现(如Nacos)管理服务实例,动态注册与发现,提升系统可扩展性。
  • 多机房部署:主备机房,通过DNS负载均衡切换,数据库主从复制、缓存集群、消息队列副本(Kafka分区+副本)保障高可用,考虑跨机房延迟(如延迟导致数据同步延迟)、网络抖动(如网络不稳定导致连接中断),通过双活部署(主主复制)减少延迟。

3) 【对比与适用场景】

  • 缓存组件(Redis vs Memcached):

    组件定义特性使用场景注意点
    Redis内存数据库,支持缓存、消息队列等高性能、支持数据持久化(RDB/AOF)、多数据结构热点数据缓存(如商品详情)、会话管理、分布式锁需配置持久化策略,集群部署(主从+哨兵)
    Memcached纯内存缓存,无持久化更快,但数据易丢失热点数据缓存(非关键数据,如临时统计)不支持持久化,适合临时缓存
  • 消息队列(Kafka vs RabbitMQ):

    组件定义特性使用场景注意点
    Kafka分布式消息队列,高吞吐容错、持久化、多消费者大流量异步处理(如订单、日志)需考虑分区、副本(如每个分区3副本),避免数据丢失
    RabbitMQ企业级消息队列基于工作队列,支持多种协议中等流量,需要可靠传输需考虑消息确认(ACK)、死信队列(处理未消费消息)
  • 数据库分库分表策略:

    方式定义特性使用场景注意点
    垂直分库按业务模块拆分数据库每个库专注业务,减少跨库操作业务模块复杂(如商品、订单、用户)需统一管理,避免数据冗余
    水平分表按数据量或规则拆分表扩展性强,按哈希/范围分表表数据量巨大(如商品表)需设计分表键(如商品分类哈希),避免热点表

4) 【示例】
用户查询商品信息流程:

  1. 应用服务器检查本地缓存(应用内Redis实例),若存在,直接返回商品信息;
  2. 若本地缓存未命中,检查分布式缓存(Redis集群),若存在,返回;
  3. 若分布式缓存未命中,查询数据库(分库分表后的商品表,如女装库),返回后更新本地+分布式缓存(应对缓存雪崩:随机过期时间;缓存穿透:布隆过滤器预过滤;缓存击穿:互斥锁)。

下单流程:

  1. 用户下单后,应用服务器将订单信息推入Kafka(生产者),设置消息唯一标识(订单ID);
  2. 消费者(库存扣减、订单状态更新)消费消息,先检查订单状态表(是否已处理),若已处理则跳过,否则扣减库存(更新库存表)、更新订单状态(写入订单表),并标记为已处理(写入状态表),实现幂等性(应对消息重复消费)。

数据库分库分表示例:商品表按商品分类哈希分表(女装库、男装库),每个库按商品ID % 100取模,分100张表,解决单表数据量超亿的问题。

5) 【面试口播版答案】
各位面试官好,针对百万级用户访问的旅游零售电商系统,核心架构设计需围绕“高并发承载、低延迟响应、数据一致性”展开。首先,请求分发与负载均衡:用Nginx做四层/七层负载均衡,分发请求到多台应用服务器,CDN缓存静态资源(如图片、JS),减少源站压力。其次,分层缓存:本地缓存(应用内Redis实例)存储高频访问数据(如商品列表、用户信息),响应时间<1ms;分布式缓存(Redis集群)共享热点数据,集群部署(主从+哨兵)保障高可用,应对缓存雪崩(随机过期时间)、穿透(布隆过滤器)、击穿(Redis分布式锁)。然后,数据库分库分表:垂直分库按业务模块(商品、订单、用户)拆分,水平分表按商品分类哈希分表(如商品ID % 100),解决单库连接数(每个库连接数1000,总连接数1万)和存储瓶颈(单表数据量超亿),读写分离提升读性能。接着,消息队列解耦:用Kafka处理订单、库存等异步任务,下单后推入Kafka,消费者异步扣减库存、更新订单状态,通过消息唯一标识(订单ID)和状态检查表保障幂等性,避免阻塞主流程。最后,服务治理与容灾:API网关(如Nginx)做负载均衡、熔断降级,服务注册发现(如Nacos)管理服务实例,多机房部署(主备切换),数据库主从复制、缓存集群、消息队列副本(Kafka分区+副本)保障高可用,考虑跨机房延迟与网络抖动。整体通过微服务拆分(商品、订单、库存服务),各服务独立部署,通过API网关聚合,提升系统可扩展性。这样设计能支撑百万级用户并发,同时保证系统稳定性和数据一致性。

6) 【追问清单】

  • 问:缓存雪崩、穿透、击穿如何具体处理?答:雪崩用随机过期时间;穿透用布隆过滤器;击穿用互斥锁(Redis分布式锁,只允许一个请求查询数据库并更新缓存)。
  • 问:数据库分库分表的具体分表键设计?答:水平分表按商品分类哈希分表(如商品ID % 100取模),垂直分库按业务模块(商品库、订单库、用户库),读写分离(主库写,从库读)。
  • 问:消息队列消费者幂等性如何保证?答:通过消息唯一标识(订单ID)和状态检查表(如订单状态表),消费时检查是否已处理,避免重复处理。
  • 问:多机房部署时,跨机房数据同步延迟如何解决?答:采用双活部署(主主复制),减少延迟;网络抖动时,通过健康检查(如心跳检测)自动切换。
  • 问:服务注册发现组件(如Nacos)具体作用?答:动态注册服务实例,实现服务发现,支持配置中心、服务治理,提升系统可扩展性。

7) 【常见坑/雷区】

  • 雷区1:只说缓存,忽略缓存策略细节(雪崩、穿透、击穿应对),被问具体措施时无法回答。
  • 雷区2:数据库分库分表只说概念,没提分表键设计(如哈希分表逻辑),被问实际分库分表方案时无具体内容。
  • 雷区3:消息队列没考虑幂等性,被问如何处理重复消费时,只说消息重试,没提状态检查。
  • 雷区4:忽略多机房容灾风险(跨机房延迟、网络抖动),只说部署,被问高可用方案时,无法解释具体措施。
  • 雷区5:服务治理中没提服务注册发现组件(如Nacos),只说后端组件,被问系统解耦时,无法说明服务如何动态发现。
51mee.com致力于为招聘者提供最新、最全的招聘信息。AI智能解析岗位要求,聚合全网优质机会。
产品招聘中心面经会员专区简历解析Resume API
联系我们南京浅度求索科技有限公司admin@51mee.com
联系客服
51mee客服微信二维码 - 扫码添加客服获取帮助
© 2025 南京浅度求索科技有限公司. All rights reserved.
公安备案图标苏公网安备32010602012192号苏ICP备2025178433号-1