模拟面试|消息队列面试思路一图懂

你好,我是大明,恭喜你学完第三章的内容,又到了要验收成果的时刻了。消息队列这一章的内容很重要,知识也很系统,所以为了帮助你更好地掌握这部分内容,我们在这里设置了面试题。

你在回答的时候,最好是能够写成一个个文档,至少也要口头上说一遍。千万不要仅仅在脑海里面回忆一遍。因为在真正面试的时候,脑海中的记忆到嘴里说出的话,还需要一个转换。

22|消息队列:消息队列可以用来解决什么问题?

  1. 你用过消息队列吗?主要用来解决什么问题?异步、削峰和解耦你能各举一个例子吗?
  2. 你用的是哪个消息队列?为什么使用它而不用别的消息队列?
  3. 为什么你一定要用消息队列?不用行不行?不用有什么缺点?
  4. 在对接多个下游的时候,直接用 RPC 调用行不行?为什么?
  5. 为什么说使用消息队列可以提高性能?
  6. 为什么说使用消息队列可以提高扩展性?
  7. 为什么说使用消息队列可以提高可用性?
  8. 为什么秒杀场景中经常用消息队列?怎么用的?
  9. 订单超时取消可以怎么实现?
  10. 你了解事件驱动吗?
  11. 什么是 SAGA 事务?怎么利用事件驱动来设计一个 SAGA 事务框架?

23|延迟消息:怎么在 Kafka 上支持延迟消息?

  1. 什么是延迟消息?你有没有用过?可以用来解决什么问题?
  2. Kafka 支不支持延迟消息?为什么 Kafka 不支持?
  3. RabbitMQ 支不支持延迟消息?怎么支持的?
  4. RabbitMQ 的延迟消息解决方案有什么缺点?让你来改进,你会怎么办?
  5. 什么是死信队列?什么是消息 ttl?
  6. 如果要让 Kafka 支持延迟消息你会怎么做?你有几种方案?各有什么优缺点?
  7. 在你的延迟消息队列方案里面,时间有多精确?比如说我希望在 10:00:00 发出来,你能保证这个一定恰好在这个时刻发出来吗?误差有多大?你能进一步提高时间精确性吗?
  8. 在分区设置不同延迟时间的方案里,能不能支持随机延迟时间?
  9. 在分区设置不同延迟时间的方案里,如果要是发生了 rebalance,会有什么后果?
  10. 当你从准备转发消息到业务 topic(biz_topic)的时候失败了,有什么后果?怎么办?
  11. 在你使用 MySQL 支持延迟消息的方案里,你怎么解决性能问题?
  12. 如果要分库分表来解决 MYSQL 的性能问题,你会怎么分库分表?是分库还是分表?
  13. 如果要是不同业务 topic 的并发量有区别,你分库分表怎么解决这种负载不均匀的问题?
  14. 如果延迟消息还要求有序性,该怎么办?
  15. 如果你已经将消息转发到了 biz_topic 上,但是更新数据库状态失败了怎么办?
  16. 除了用 MySQL,可以考虑用别的中间件来实现延迟消息吗?

24|消息积压:业务突然增长,导致消息消费不过来怎么办?

  1. 一个分区可以有多个消费者吗?一个消费者可以消费多个分区吗?
  2. 你业务里面的消息有多少个分区?你怎么计算出来的?它能撑住多大的读写压力?
  3. 你遇到过消息积压吗?怎么发现的?为什么会积压?最后怎么解决的?
  4. 为什么会出现消息积压?只要我容量规划好,肯定不会有消息积压,对不对?
  5. 消息积压可以考虑怎么解决?
  6. 增加消费者数量能不能解决消息积压问题?
  7. 能不能通过限制发送者,让他们少发一点来解决消息积压问题?
  8. 现在我发现分区数量不够了,但是运维又不准我增加新的分区,该怎么办?
  9. 异步消费有什么缺陷?
  10. 你怎么解决异步消费的消息丢失问题?你的方案会引起重复消费吗?
  11. 在异步消费一批消息的时候,要是有部分消费失败了,怎么办?要不要提交?

25|消息顺序:保证消息有序,一个 topic 只能有一个 partition 吗?

  1. 消息在Kafka 分区上是怎么存储的?
  2. 什么是有序消息?用于解决什么问题?
  3. Kafka 上的消息是有序的吗?为什么?
  4. 要想在 Kafka 上保证消息有序,应该怎么做?
  5. 什么是全局有序?要保证全局有序,在 Kafka 上可以怎么做?
  6. 要保证消息有序,一个 topic 只能有一个 partition 吗?
  7. 异步消费的时候怎么保证消息有序?
  8. 在你使用的多分区方案中,有没有可能出现分区间负载不均衡的问题?怎么解决?
  9. 增加分区有可能让你的消息失序吗?怎么解决?
  10. 你还知道哪些消息队列是支持有序消息的?
  11. 要做到跨 topic 的消息也有序,难点在哪里?

26|消息不丢失:生产者收到写入成功响应后消息一定不会丢失吗?

  1. 什么是 ISR?什么是 OSR?
  2. 一个分区什么情况下会被挪进去 ISR,什么时候又会被挪出 ISR?
  3. 生产者的 acks 参数有什么含义?你用的是多少?
  4. 怎么感觉业务选择合适的 acks 参数?
  5. 消息丢失的场景有哪些?
  6. 你遇到过消息丢失的问题吗?是什么原因引起的?你怎么排查的?最终怎么解决的?
  7. 当生产者收到发送成功的响应之后,消息就肯定不会丢失吗?
  8. acks 设置为 all,消息就一定不会丢失吗?
  9. 什么是事务消息?Kafka 支持事务消息吗?
  10. 怎么在 Kafka 上支持事务消息?
  11. 什么是本地消息表?拿来做什么的?
  12. 你是怎么保证你在执行了业务操作之后,消息一定发出去了?
  13. 怎么保证生产者收到发送成功的响应之后,消息一定不会丢失?需要调整哪些参数?
  14. 什么是 unclean 选举?有什么问题?你用的 Kafka 允许 unclean 选举吗?
  15. 在你设计的回查方案里面,你怎么知道应该回查哪个接口?你这个能同时支持 HTTP 和 RPC 吗?能方便扩展到别的协议吗?
  16. 你的回查机制有没有可能先收到提交消息?再收到准备消息?怎么保证两者的顺序?
  17. 如果你已经把消息发到了业务 topic 上,但是你标记已发送失败了,怎么办?

27|重复消费:高并发场景下怎么保证消息不会重复消费?

  1. 什么是布隆过滤器?
  2. 什么是 bit array?
  3. 为什么说尽量把消费者设计成幂等的?
  4. 什么场景会造成重复消费?
  5. 什么是恰好一次语义,Kafka 支持恰好一次语义吗?
  6. 利用唯一索引来实现幂等的方案里,你是先插入数据到唯一索引,还是先执行业务?为什么
  7. 如果先插入唯一索引成功了,但是业务执行失败了,怎么办?
  8. 如果不能使用本地事务,你怎么利用唯一索引来实现幂等?中间可能会有什么问题?你怎么解决?
  9. 利用唯一索引来解决幂等问题,有什么缺陷?
  10. 高并发场景下,怎么解决幂等问题?
  11. 在你的高并发幂等方案里面,为什么要引入 Redis?
  12. Redis 里面的 Key 过期时间该怎么确定?
  13. 布隆过滤器 + Redis + 唯一索引里面,去掉布隆过滤器行不行?去掉 Redis 呢?去掉唯一索引呢?
  14. 布隆过滤器 + Redis + 唯一索引方案中能不能使用本地布隆过滤器?怎么用?
  15. 布隆过滤器 + Redis + 唯一索引有什么缺陷?

28|架构设计:如果让你设计一个消息队列,你会怎么设计架构

  1. Kafka 为什么要引入分区?只有 topic 行不行?
  2. Kafka 为什么要强调把 topic 的分区分散在不同的 broker 上?
  3. Kafka 为什么要引入消费者组概念?只有消费者行不行?
  4. Kafka 为什么要引入 topic?
  5. 如果让你来设计一个消息队列,你会怎么设计架构?
  6. 在你的设计里面,你能支持延迟消息吗?
  7. 在你的设计里面,怎么保证消息有序?
  8. 在你的设计里面,会出现消息丢失的问题吗?
  9. 在你的设计里面,什么场景会引起重复消息?
  10. 在你的设计里面,你觉得性能瓶颈可能出现在哪里?
  11. 在你的设计里面,你还可以考虑怎么提高性能?

29|高性能:Kafka 为什么性能那么好

  1. 为什么 Kafka 性能那么好?
  2. 为什么零拷贝性能那么好?
  3. 写磁盘一定很慢吗?顺序写为什么很快?
  4. 批量操作为什么快?节省了什么资源?
  5. 什么是上下文切换?为什么上下文切换慢?
  6. 分区过多有什么问题?topic 过多有什么问题?
  7. 分区有什么好处?
  8. 实际中使用批量发送之类的技术,可能出现什么问题?怎么解决?
  9. 什么是 page cache ?为什么要引入 page cache?

30|Kafka 综合运用:怎么在实践中保证 Kafka 高性能?

  1. 什么是交换区?
  2. 如果来不及发送,那么性能瓶颈可能在哪里?
  3. 怎么优化发送者的发送性能?
  4. 批次发送的时候,多大的批次才是最合适的?
  5. 使用压缩有什么优缺点?怎么选择合适的压缩算法?
  6. 怎么优化 broker?
  7. 怎么优化 broker 所在的操作系统?
  8. 什么是 TCP 读写缓冲区?怎么调优?
  9. 哪些参数可以影响 Kafka 的主从同步?你优化过吗?
  10. 你有优化过 Kafka 的 JVM 吗?怎么优化的?

消息队列面试一图懂

图片

最后我将这一章的内容整理成了一张图片,图片能够更好地展现知识点之间的联系,你可以参考,如果你觉得有用的话,可以把这节课的内容分享给身边的朋友,邀他一起学习,共同进步。好了,我们下一章再见吧!