映客直播后台开发一面:索引、事务、Kafka 与订单幂等
- 轮次
- 一面
- 时间
- 2026-10
- 来源
- 牛客网
《面试题目》
- 自我介绍,然后讲一个实习期间做得好的项目(约 25 分钟)。
- 数据库索引如何加快查询速度?
- 什么是 B+ 树?
- 联合索引的使用条件是什么?
- 范围查询能否使用联合索引?
- ACID 是什么?
- 事务是什么?
- Redis 的基本数据结构有哪些,分别适用什么场景?
- 什么是中间件?你了解哪些中间件?
- Kafka 的基础架构是怎样的?
- RPC 和 HTTP 有什么区别?
- 微服务和单体服务的区别?
- gRPC 能否跨机器调用?
- 如何设计一个订单服务并且保证幂等?
《参考解析》
索引加快查询的本质是把 O(n) 扫描变成 O(log n) 的树查找。InnoDB 用 B+ 树:非叶子节点只存键、扇出大、树高低,叶子节点存数据并用链表相连,所以等值查询稳定、范围查询和排序也友好。索引不是越多越好,每个索引都要占空间、拖慢写入。
联合索引遵循最左前缀。(a, b, c) 能支持 a、a,b、a,b,c 的等值查询;遇到范围条件(a > x)后面的列无法继续用于定位,只能做索引条件下推过滤。所以设计顺序时把等值列放前面、范围列放后面,再按选择性调整。
ACID 落到 InnoDB 的实现:原子性靠 Undo Log,持久性靠 Redo Log,隔离性靠 MVCC + 锁,一致性是前三者加上业务约束的结果。事务是一组要么全成功要么全失败的操作,隔离级别决定并发事务之间能看到什么。
Redis 五种基础结构:String(缓存、计数器、分布式锁)、Hash(对象字段)、List(队列、时间线)、Set(去重、交并集)、ZSet(排行榜、延时队列)。选型看访问模式,别把 Redis 当数据库用。
Kafka 的基础架构:broker 组成集群,topic 逻辑上分 partition,每个 partition 有 leader 和 follower,生产者按 key 或轮询写分区,消费者以 consumer group 为单位分配分区,靠 offset 记录消费进度。它适合高吞吐的日志和流式场景,不擅长复杂路由和延迟消息。
RPC 与 HTTP 的区别在抽象层次:RPC 强调像调本地方法一样调远程服务,通常有 IDL、序列化协议和连接复用;HTTP 是通用应用层协议,文本语义、生态好、穿透性强。gRPC 基于 HTTP/2,可以跨机器调用,天然支持流式和多路复用。
订单服务保证幂等:客户端生成幂等键(业务唯一号),服务端建唯一索引或在 Redis 里 SETNX 占位;创建订单和扣库存放在同一个本地事务或可靠消息里,重复请求直接返回已有订单;状态流转用条件更新,避免重复支付和重复发货。