Skip to content
第 206 / 250 章中间件⏱ 12 分钟阅读

第 206 章:中间件章节总结与面试题

学习目标

  • 回顾中间件核心知识
  • 掌握高频面试题
  • 理解选型决策框架
  • 进阶学习路径

一、知识图谱

二、Redis 高频面试题

Q1:Redis 为什么快?

  1. 基于内存
  2. 单线程(无锁竞争)
  3. IO 多路复用(epoll)
  4. 自定义数据结构(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 为什么快?

  1. 顺序写磁盘(磁头不移动)
  2. 零拷贝( sendfile)
  3. 批量发送 + 压缩
  4. 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

维度KafkaRabbitMQ
吞吐百万
路由简单复杂
延迟msus
适用日志业务

四、RabbitMQ 高频面试题

Q1:交换机类型

  • Direct:精确
  • Topic:通配符
  • Fanout:广播
  • Headers:少用

Q2:如何保证消息可靠?

  • 持久化(队列 + 消息)
  • 镜像队列
  • Publisher Confirm
  • 消费者手动 ACK

Q3:延迟队列实现

  1. TTL + DLX(经典)
  2. delayed plugin(推荐)

Q4:死信队列场景

  • 消息过期
  • 队列满
  • 消费被拒

五、ES 高频面试题

Q1:倒排索引是什么?

词项 → 文档列表的映射,搜索时直接定位。

Q2:ES vs MySQL

ESMySQL
全文搜索精确查询
弱事务强事务
实时准实时
大量读大量写

Q3:深分页问题

from + size > 10000 会报错。

解决:search_afterscroll / PIT。

Q4:相关性打分 BM25

  • TF:词频
  • IDF:逆文档频率
  • 字段长度归一化

六、MongoDB 高频面试题

Q1:嵌入 vs 引用

  • 一对少 → 嵌入
  • 一对多 / 多对多 → 引用

Q2:$lookup 用法

类似 SQL JOIN,但有性能代价,谨慎使用。

Q3:索引类型

  • 单字段 / 复合
  • 多键(数组)
  • TTL / 文本 / 哈希

七、选型决策

八、Redis 场景总结

场景方案
缓存String / Hash + TTL
排行榜ZSet
去重Set / BitMap
分布式锁SETNX + Lua
限流INCR + 过期
SessionSpring Session
延迟队列ZSet + 轮询
消息Stream / Pub/Sub
计数器INCR
UVHyperLogLog
附近GEO

九、性能指标参考

中间件典型 QPS延迟
Redis10w+us
MySQL1wms
Kafka百万ms
RabbitMQus
ES10ms+

十、学习路径

十一、本章小结

中间件选型遵循三原则:

  1. 业务匹配:事务、延迟、路由
  2. 团队熟悉度:运维成本
  3. 生态完整度:Spring 集成、监控

动手练习

  1. 用 Redis 完整实现分布式锁(看门狗版)
  2. 用 Kafka + 本地消息表实现最终一致性
  3. 部署 3 节点 ES 集群
  4. MongoDB 复制集 + 分片测试

推荐阅读


恭喜你完成了中间件 15 章的学习! 🎉

下一步:第 207 章:Linux 基础与常用命令

本站基于 VitePress 构建 · 由 Codebook 团队维护