模拟面试|消息队列面试思路一图懂
模拟面试|消息队列面试思路一图懂
你好,我是大明,恭喜你学完第三章的内容,又到了要验收成果的时刻了。消息队列这一章的内容很重要,知识也很系统,所以为了帮助你更好地掌握这部分内容,我们在这里设置了面试题。
你在回答的时候,最好是能够写成一个个文档,至少也要口头上说一遍。千万不要仅仅在脑海里面回忆一遍。因为在真正面试的时候,脑海中的记忆到嘴里说出的话,还需要一个转换。
22|消息队列:消息队列可以用来解决什么问题?
- 你用过消息队列吗?主要用来解决什么问题?异步、削峰和解耦你能各举一个例子吗?
- 你用的是哪个消息队列?为什么使用它而不用别的消息队列?
- 为什么你一定要用消息队列?不用行不行?不用有什么缺点?
- 在对接多个下游的时候,直接用 RPC 调用行不行?为什么?
- 为什么说使用消息队列可以提高性能?
- 为什么说使用消息队列可以提高扩展性?
- 为什么说使用消息队列可以提高可用性?
- 为什么秒杀场景中经常用消息队列?怎么用的?
- 订单超时取消可以怎么实现?
- 你了解事件驱动吗?
- 什么是 SAGA 事务?怎么利用事件驱动来设计一个 SAGA 事务框架?
23|延迟消息:怎么在 Kafka 上支持延迟消息?
- 什么是延迟消息?你有没有用过?可以用来解决什么问题?
- Kafka 支不支持延迟消息?为什么 Kafka 不支持?
- RabbitMQ 支不支持延迟消息?怎么支持的?
- RabbitMQ 的延迟消息解决方案有什么缺点?让你来改进,你会怎么办?
- 什么是死信队列?什么是消息 ttl?
- 如果要让 Kafka 支持延迟消息你会怎么做?你有几种方案?各有什么优缺点?
- 在你的延迟消息队列方案里面,时间有多精确?比如说我希望在 10:00:00 发出来,你能保证这个一定恰好在这个时刻发出来吗?误差有多大?你能进一步提高时间精确性吗?
- 在分区设置不同延迟时间的方案里,能不能支持随机延迟时间?
- 在分区设置不同延迟时间的方案里,如果要是发生了 rebalance,会有什么后果?
- 当你从准备转发消息到业务 topic(biz_topic)的时候失败了,有什么后果?怎么办?
- 在你使用 MySQL 支持延迟消息的方案里,你怎么解决性能问题?
- 如果要分库分表来解决 MYSQL 的性能问题,你会怎么分库分表?是分库还是分表?
- 如果要是不同业务 topic 的并发量有区别,你分库分表怎么解决这种负载不均匀的问题?
- 如果延迟消息还要求有序性,该怎么办?
- 如果你已经将消息转发到了 biz_topic 上,但是更新数据库状态失败了怎么办?
- 除了用 MySQL,可以考虑用别的中间件来实现延迟消息吗?
24|消息积压:业务突然增长,导致消息消费不过来怎么办?
- 一个分区可以有多个消费者吗?一个消费者可以消费多个分区吗?
- 你业务里面的消息有多少个分区?你怎么计算出来的?它能撑住多大的读写压力?
- 你遇到过消息积压吗?怎么发现的?为什么会积压?最后怎么解决的?
- 为什么会出现消息积压?只要我容量规划好,肯定不会有消息积压,对不对?
- 消息积压可以考虑怎么解决?
- 增加消费者数量能不能解决消息积压问题?
- 能不能通过限制发送者,让他们少发一点来解决消息积压问题?
- 现在我发现分区数量不够了,但是运维又不准我增加新的分区,该怎么办?
- 异步消费有什么缺陷?
- 你怎么解决异步消费的消息丢失问题?你的方案会引起重复消费吗?
- 在异步消费一批消息的时候,要是有部分消费失败了,怎么办?要不要提交?
25|消息顺序:保证消息有序,一个 topic 只能有一个 partition 吗?
- 消息在Kafka 分区上是怎么存储的?
- 什么是有序消息?用于解决什么问题?
- Kafka 上的消息是有序的吗?为什么?
- 要想在 Kafka 上保证消息有序,应该怎么做?
- 什么是全局有序?要保证全局有序,在 Kafka 上可以怎么做?
- 要保证消息有序,一个 topic 只能有一个 partition 吗?
- 异步消费的时候怎么保证消息有序?
- 在你使用的多分区方案中,有没有可能出现分区间负载不均衡的问题?怎么解决?
- 增加分区有可能让你的消息失序吗?怎么解决?
- 你还知道哪些消息队列是支持有序消息的?
- 要做到跨 topic 的消息也有序,难点在哪里?
26|消息不丢失:生产者收到写入成功响应后消息一定不会丢失吗?
- 什么是 ISR?什么是 OSR?
- 一个分区什么情况下会被挪进去 ISR,什么时候又会被挪出 ISR?
- 生产者的 acks 参数有什么含义?你用的是多少?
- 怎么感觉业务选择合适的 acks 参数?
- 消息丢失的场景有哪些?
- 你遇到过消息丢失的问题吗?是什么原因引起的?你怎么排查的?最终怎么解决的?
- 当生产者收到发送成功的响应之后,消息就肯定不会丢失吗?
- acks 设置为 all,消息就一定不会丢失吗?
- 什么是事务消息?Kafka 支持事务消息吗?
- 怎么在 Kafka 上支持事务消息?
- 什么是本地消息表?拿来做什么的?
- 你是怎么保证你在执行了业务操作之后,消息一定发出去了?
- 怎么保证生产者收到发送成功的响应之后,消息一定不会丢失?需要调整哪些参数?
- 什么是 unclean 选举?有什么问题?你用的 Kafka 允许 unclean 选举吗?
- 在你设计的回查方案里面,你怎么知道应该回查哪个接口?你这个能同时支持 HTTP 和 RPC 吗?能方便扩展到别的协议吗?
- 你的回查机制有没有可能先收到提交消息?再收到准备消息?怎么保证两者的顺序?
- 如果你已经把消息发到了业务 topic 上,但是你标记已发送失败了,怎么办?
27|重复消费:高并发场景下怎么保证消息不会重复消费?
- 什么是布隆过滤器?
- 什么是 bit array?
- 为什么说尽量把消费者设计成幂等的?
- 什么场景会造成重复消费?
- 什么是恰好一次语义,Kafka 支持恰好一次语义吗?
- 利用唯一索引来实现幂等的方案里,你是先插入数据到唯一索引,还是先执行业务?为什么
- 如果先插入唯一索引成功了,但是业务执行失败了,怎么办?
- 如果不能使用本地事务,你怎么利用唯一索引来实现幂等?中间可能会有什么问题?你怎么解决?
- 利用唯一索引来解决幂等问题,有什么缺陷?
- 高并发场景下,怎么解决幂等问题?
- 在你的高并发幂等方案里面,为什么要引入 Redis?
- Redis 里面的 Key 过期时间该怎么确定?
- 布隆过滤器 + Redis + 唯一索引里面,去掉布隆过滤器行不行?去掉 Redis 呢?去掉唯一索引呢?
- 布隆过滤器 + Redis + 唯一索引方案中能不能使用本地布隆过滤器?怎么用?
- 布隆过滤器 + Redis + 唯一索引有什么缺陷?
28|架构设计:如果让你设计一个消息队列,你会怎么设计架构
- Kafka 为什么要引入分区?只有 topic 行不行?
- Kafka 为什么要强调把 topic 的分区分散在不同的 broker 上?
- Kafka 为什么要引入消费者组概念?只有消费者行不行?
- Kafka 为什么要引入 topic?
- 如果让你来设计一个消息队列,你会怎么设计架构?
- 在你的设计里面,你能支持延迟消息吗?
- 在你的设计里面,怎么保证消息有序?
- 在你的设计里面,会出现消息丢失的问题吗?
- 在你的设计里面,什么场景会引起重复消息?
- 在你的设计里面,你觉得性能瓶颈可能出现在哪里?
- 在你的设计里面,你还可以考虑怎么提高性能?
29|高性能:Kafka 为什么性能那么好
- 为什么 Kafka 性能那么好?
- 为什么零拷贝性能那么好?
- 写磁盘一定很慢吗?顺序写为什么很快?
- 批量操作为什么快?节省了什么资源?
- 什么是上下文切换?为什么上下文切换慢?
- 分区过多有什么问题?topic 过多有什么问题?
- 分区有什么好处?
- 实际中使用批量发送之类的技术,可能出现什么问题?怎么解决?
- 什么是 page cache ?为什么要引入 page cache?
30|Kafka 综合运用:怎么在实践中保证 Kafka 高性能?
- 什么是交换区?
- 如果来不及发送,那么性能瓶颈可能在哪里?
- 怎么优化发送者的发送性能?
- 批次发送的时候,多大的批次才是最合适的?
- 使用压缩有什么优缺点?怎么选择合适的压缩算法?
- 怎么优化 broker?
- 怎么优化 broker 所在的操作系统?
- 什么是 TCP 读写缓冲区?怎么调优?
- 哪些参数可以影响 Kafka 的主从同步?你优化过吗?
- 你有优化过 Kafka 的 JVM 吗?怎么优化的?
消息队列面试一图懂
最后我将这一章的内容整理成了一张图片,图片能够更好地展现知识点之间的联系,你可以参考,如果你觉得有用的话,可以把这节课的内容分享给身边的朋友,邀他一起学习,共同进步。好了,我们下一章再见吧!