第 206 章:中间件章节总结与面试题
学习目标
- 回顾中间件核心知识
- 掌握高频面试题
- 理解选型决策框架
- 进阶学习路径
一、知识图谱
二、Redis 高频面试题
Q1:Redis 为什么快?
- 基于内存
- 单线程(无锁竞争)
- IO 多路复用(epoll)
- 自定义数据结构(SDS、跳跃表)
Q2:Redis 数据结构
- 基础:String、Hash、List、Set、ZSet
- 高级:BitMap、HyperLogLog、GEO、Stream
Q3:缓存三大问题
| 问题 | 解决 |
|---|---|
| 穿透 | 布隆过滤器、空值缓存 |
| 击穿 | 分布式锁、热点预热 |
| 雪崩 | 随机 TTL、多级缓存 |
Q4:Redis 持久化
| 方式 | 优点 | 缺点 |
|---|---|---|
| RDB | 小、快 | 可能丢 |
| AOF | 全 | 慢、大 |
| 混合 | 平衡 | 复杂度 |
Q5:Redis 集群方案
- 主从:读写分离
- 哨兵:自动故障转移
- Cluster:水平扩展(16384 slot)
Q6:分布式锁实现
java
SET key value NX PX 30000要点:必须原子 + 唯一 value + Lua 释放
Q7:Redisson 看门狗原理
后台线程每 1/3 锁时间续期,业务未完成就续。
三、Kafka 高频面试题
Q1:Kafka 为什么快?
- 顺序写磁盘(磁头不移动)
- 零拷贝( sendfile)
- 批量发送 + 压缩
- PageCache 利用
Q2:Kafka 如何保证不丢消息?
- Producer:acks=all + 幂等性
- Broker:多副本 + min.insync.replicas
- Consumer:手动提交 offset
Q3:如何保证消息顺序?
- 分区内有序
- 同一 key → 同一分区
- 一个消费者消费该分区
Q4:Kafka 分区数如何确定?
- 期望吞吐 / 单分区吞吐
- 一般每分区 10-30MB/s
- 建议略多于消费者数
Q5:Kafka Rebalance
消费者加入/退出时触发,期间停止消费。
避免:
session.timeout.ms不宜过短- 实现
ConsumerRebalanceListener
Q6:Kafka vs RabbitMQ
| 维度 | Kafka | RabbitMQ |
|---|---|---|
| 吞吐 | 百万 | 万 |
| 路由 | 简单 | 复杂 |
| 延迟 | ms | us |
| 适用 | 日志 | 业务 |
四、RabbitMQ 高频面试题
Q1:交换机类型
- Direct:精确
- Topic:通配符
- Fanout:广播
- Headers:少用
Q2:如何保证消息可靠?
- 持久化(队列 + 消息)
- 镜像队列
- Publisher Confirm
- 消费者手动 ACK
Q3:延迟队列实现
- TTL + DLX(经典)
- delayed plugin(推荐)
Q4:死信队列场景
- 消息过期
- 队列满
- 消费被拒
五、ES 高频面试题
Q1:倒排索引是什么?
词项 → 文档列表的映射,搜索时直接定位。
Q2:ES vs MySQL
| ES | MySQL |
|---|---|
| 全文搜索 | 精确查询 |
| 弱事务 | 强事务 |
| 实时 | 准实时 |
| 大量读 | 大量写 |
Q3:深分页问题
from + size > 10000 会报错。
解决:search_after 或 scroll / PIT。
Q4:相关性打分 BM25
- TF:词频
- IDF:逆文档频率
- 字段长度归一化
六、MongoDB 高频面试题
Q1:嵌入 vs 引用
- 一对少 → 嵌入
- 一对多 / 多对多 → 引用
Q2:$lookup 用法
类似 SQL JOIN,但有性能代价,谨慎使用。
Q3:索引类型
- 单字段 / 复合
- 多键(数组)
- TTL / 文本 / 哈希
七、选型决策
八、Redis 场景总结
| 场景 | 方案 |
|---|---|
| 缓存 | String / Hash + TTL |
| 排行榜 | ZSet |
| 去重 | Set / BitMap |
| 分布式锁 | SETNX + Lua |
| 限流 | INCR + 过期 |
| Session | Spring Session |
| 延迟队列 | ZSet + 轮询 |
| 消息 | Stream / Pub/Sub |
| 计数器 | INCR |
| UV | HyperLogLog |
| 附近 | GEO |
九、性能指标参考
| 中间件 | 典型 QPS | 延迟 |
|---|---|---|
| Redis | 10w+ | us |
| MySQL | 1w | ms |
| Kafka | 百万 | ms |
| RabbitMQ | 万 | us |
| ES | 千 | 10ms+ |
十、学习路径
十一、本章小结
中间件选型遵循三原则:
- 业务匹配:事务、延迟、路由
- 团队熟悉度:运维成本
- 生态完整度:Spring 集成、监控
动手练习
- 用 Redis 完整实现分布式锁(看门狗版)
- 用 Kafka + 本地消息表实现最终一致性
- 部署 3 节点 ES 集群
- MongoDB 复制集 + 分片测试
推荐阅读
恭喜你完成了中间件 15 章的学习! 🎉
下一步:第 207 章:Linux 基础与常用命令 →