RabbitMQ:常见面试题总结
- 问题1: RabbitMQ为什么需要通道,为什么不是TCP直接通信?
- 问题2: RabbitMQ通过channel发送消息到队列一定要有交换机吗?
- 问题3: RabbitMQ默认采用的消息模式是什么(SpringBoot)?
- 问题4: RabbitMQ常用的消息模式有哪些?它们有什么区别?
- 问题5: RabbitMQ持久化是什么?
- 问题6: RabbitMQ如何保障消息可靠生产?
- 问题7: RabbitMQ如何解决消费者出现异常死循环问题?
- 问题8: RabbitMQ如何解决消息积压问题?
- 问题9: RabbitMQ死信队列是什么?
- 问题10: RabbitMQ如何设置消息存活时间与队列存储界限?
- 问题11: RabbitMQ如何保证消息不丢失?
问题1: RabbitMQ为什么需要通道,为什么不是TCP直接通信?
1、TCP的创建和销毁,开销大,创建要3次握手,销毁要4次挥手。
2、如果不用信道,那应用程序就会TCP连接到Rabbit服务器,高峰时每秒成千上万连接就会造成资源的巨大浪费,而且操作系统每秒处理tcp连接数也是有限制的,必定造成性能瓶颈。
3、信道的原理是一条线程一条信道,多条线程多条信道同用一条TCP连接,一条TCP连接可以容纳无限的信道,即使每秒成千上万的请求也不会成为性能瓶颈。
问题2: RabbitMQ通过channel发送消息到队列一定要有交换机吗?
对的,一定需要通过交换机才能把消息发送到队列中存储。
如果没有指定交换机就会用默认的交换机。
问题3: RabbitMQ默认采用的消息模式是什么(SpringBoot)?
路由模式 :direct
问题4: RabbitMQ常用的消息模式有哪些?它们有什么区别?
-
简单消息模式(simple) 默认交换机(1-1)
-
工作队列模式(work) 默认交换机(1-N, 消费者竞争关系)
-
发布订阅模式(fanout) 有交换机,没有路由key (1-N,多个消费者同时接收消息)
-
路由模式(direct) 有交换机,有路由key (1-N,多个消费者,根据路由key有选择性接收消息)
-
主题模式(topic) 有交换机,有路由key,路由key可以用通匹符 *或#
问题5: RabbitMQ持久化是什么?
RabbitMQ队列中的数据可以存储到磁盘。durable=true
问题6: RabbitMQ如何保障消息可靠生产?
-
生产者在发送消息之前,先把消息存储到redis数据库.
-
生产者需要设置confirmCallback回调确认对象,当消息发送成功,RabbitMQ服务会回调confirm()方法让生产者进行确认,如果ack是true就代表消息生产成功,否则生成失败。
// 设置回调确认对象
rabbitTemplate.setConfirmCallback(confirmCallback); -
如果生产成功,生产者可以从Redis数据库中删除消息。
-
需要用到定时器,定时从Redis数据库查询消息,再次发送。
问题7: RabbitMQ如何解决消费者出现异常死循环问题?
手动进行ACK消息确认
问题8: RabbitMQ如何解决消息积压问题?
- 设置消息存活时间(TTL) Time To Live
- 设置队列中存储消息的界限(Lim) limit
- 重试多次失败的消息,路由到死信队列,避免队列阻塞。
问题9: RabbitMQ死信队列是什么?
死信队列(DLQ): 它实际上也是一个普通的队列,只是该队列存储的消息为:过期的消息、被拒的消息、超出队列界限的消息、重试消费失败的消息。
问题10: RabbitMQ如何设置消息存活时间与队列存储界限?
- 设置消息存活时间(TTL): 在创建队列时指定属性 x-message-ttl
- 设置队列存储界限(Lim): 在创建队列时指定属性 x-max-length
问题11: RabbitMQ如何保证消息不丢失?
- 消费者开启,手动消息ACK确认机制。
- 消息重投。
- 拒绝确认的消息,在丢弃之后,需要存入死信队列。
- 死信队列中的消息还消费失败的话,就需要人为干预。(可以发短信进行预警)
小弟简单概述,大佬有任何补充,或者需要修正的地方欢迎评论留言。