RabbitMQ你懂的

问题1: RabbitMQ为什么需要通道,为什么不是TCP直接通信?

1、TCP的创建和销毁,开销大,创建要3次握手,销毁要4次挥手。

2、如果不用信道,那应用程序就会TCP连接到Rabbit服务器,高峰时每秒成千上万连接就会造成资源的巨大浪费,而且操作系统每秒处理tcp连接数也是有限制的,必定造成性能瓶颈。

3、信道的原理是一条线程一条信道,多条线程多条信道同用一条TCP连接,一条TCP连接可以容纳无限的信道,即使每秒成千上万的请求也不会成为性能瓶颈。


问题2: RabbitMQ通过channel发送消息到队列一定要有交换机吗?

对的,一定需要通过交换机才能把消息发送到队列中存储。
如果没有指定交换机就会用默认的交换机。


问题3: RabbitMQ默认采用的消息模式是什么(SpringBoot)?

路由模式 :direct


问题4: RabbitMQ常用的消息模式有哪些?它们有什么区别?

  1. 简单消息模式(simple) 默认交换机(1-1)

  2. 工作队列模式(work) 默认交换机(1-N, 消费者竞争关系)

  3. 发布订阅模式(fanout) 有交换机,没有路由key (1-N,多个消费者同时接收消息)

  4. 路由模式(direct) 有交换机,有路由key (1-N,多个消费者,根据路由key有选择性接收消息)

  5. 主题模式(topic) 有交换机,有路由key,路由key可以用通匹符 *或#


问题5: RabbitMQ持久化是什么?

RabbitMQ队列中的数据可以存储到磁盘。durable=true


问题6: RabbitMQ如何保障消息可靠生产?

  1. 生产者在发送消息之前,先把消息存储到redis数据库.

  2. 生产者需要设置confirmCallback回调确认对象,当消息发送成功,RabbitMQ服务会回调confirm()方法让生产者进行确认,如果ack是true就代表消息生产成功,否则生成失败。
    // 设置回调确认对象
    rabbitTemplate.setConfirmCallback(confirmCallback);

  3. 如果生产成功,生产者可以从Redis数据库中删除消息。

  4. 需要用到定时器,定时从Redis数据库查询消息,再次发送。


问题7: RabbitMQ如何解决消费者出现异常死循环问题?

手动进行ACK消息确认


问题8: RabbitMQ如何解决消息积压问题?

  1. 设置消息存活时间(TTL) Time To Live
  2. 设置队列中存储消息的界限(Lim) limit
  3. 重试多次失败的消息,路由到死信队列,避免队列阻塞。

问题9: RabbitMQ死信队列是什么?

死信队列(DLQ): 它实际上也是一个普通的队列,只是该队列存储的消息为:过期的消息、被拒的消息、超出队列界限的消息、重试消费失败的消息。


问题10: RabbitMQ如何设置消息存活时间与队列存储界限?

  1. 设置消息存活时间(TTL): 在创建队列时指定属性 x-message-ttl
  2. 设置队列存储界限(Lim): 在创建队列时指定属性 x-max-length

问题11: RabbitMQ如何保证消息不丢失?

  1. 消费者开启,手动消息ACK确认机制。
  2. 消息重投。
  3. 拒绝确认的消息,在丢弃之后,需要存入死信队列。
  4. 死信队列中的消息还消费失败的话,就需要人为干预。(可以发短信进行预警)

小弟简单概述,大佬有任何补充,或者需要修正的地方欢迎评论留言。

猜你喜欢

转载自blog.csdn.net/weixin_43249535/article/details/105985980