面灵AI→

映客直播后台开发一面:索引、事务、Kafka 与订单幂等

轮次
一面
时间
2026-10
来源
牛客网

《面试题目》

  1. 自我介绍,然后讲一个实习期间做得好的项目(约 25 分钟)。
  2. 数据库索引如何加快查询速度?
  3. 什么是 B+ 树?
  4. 联合索引的使用条件是什么?
  5. 范围查询能否使用联合索引?
  6. ACID 是什么?
  7. 事务是什么?
  8. Redis 的基本数据结构有哪些,分别适用什么场景?
  9. 什么是中间件?你了解哪些中间件?
  10. Kafka 的基础架构是怎样的?
  11. RPC 和 HTTP 有什么区别?
  12. 微服务和单体服务的区别?
  13. gRPC 能否跨机器调用?
  14. 如何设计一个订单服务并且保证幂等?

《参考解析》

索引加快查询的本质是把 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 占位;创建订单和扣库存放在同一个本地事务或可靠消息里,重复请求直接返回已有订单;状态流转用条件更新,避免重复支付和重复发货。