千家信息网

RabbitMQ面试要点有哪些

发表于:2025-12-01 作者:千家信息网编辑
千家信息网最后更新 2025年12月01日,这篇文章主要为大家展示了"RabbitMQ面试要点有哪些",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"RabbitMQ面试要点有哪些"这篇文章吧。1. 如
千家信息网最后更新 2025年12月01日RabbitMQ面试要点有哪些

这篇文章主要为大家展示了"RabbitMQ面试要点有哪些",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"RabbitMQ面试要点有哪些"这篇文章吧。



1. 如何确保消息正确地发送至RabbitMQ?

RabbitMQ使用发送方确认模式,确保消息正确地发送到RabbitMQ。

发送方确认模式:将信道设置成confirm模式(发送方确认模式),则所有在信道上发布的消息都会被指派一个唯一的ID。一旦消息被投递到目的队列后,或者消息被写入磁盘后(可持久化的消息),信道会发送一个确认给生产者(包含消息唯一ID)。如果RabbitMQ发生内部错误从而导致消息丢失,会发送一条nack(not acknowledged,未确认)消息。

发送方确认模式是异步的,生产者应用程序在等待确认的同时,可以继续发送消息。当确认消息到达生产者应用程序,生产者应用程序的回调方法就会被触发来处理确认消息。

2. 如何确保消息接收方消费了消息?


接收方消息确认机制:消费者接收每一条消息后都必须进行确认(消息接收和消息确认是两个不同操作)。只有消费者确认了消息,RabbitMQ才能安全地把消息从队列中删除。

这里并没有用到超时机制,RabbitMQ仅通过Consumer的连接中断来确认是否需要重新发送消息。也就是说,只要连接不中断,RabbitMQ给了Consumer足够长的时间来处理消息。

下面罗列几种特殊情况:

  • 如果消费者接收到消息,在确认之前断开了连接或取消订阅,RabbitMQ会认为消息没有被分发,然后重新分发给下一个订阅的消费者。

    (可能存在消息重复消费的隐患,需要根据bizId去重)

  • 如果消费者接收到消息却没有确认消息,连接也未断开,则RabbitMQ认为该消费者繁忙,将不会给该消费者分发更多的消息。


3. 如何避免消息重复投递或重复消费?


在消息生产时,MQ内部针对每条生产者发送的消息生成一个inner-msg-id,作为去重和幂等的依据(消息投递失败并重传),避免重复的消息进入队列;在消息消费时,要求消息体中必须要有一个bizId(对于同一业务全局唯一,如支付ID、订单ID、帖子ID等)作为去重和幂等的依据,避免同一条消息被重复消费。


4. 消息基于什么传输?


由于TCP连接的创建和销毁开销较大,且并发数受系统资源限制,会造成性能瓶颈。RabbitMQ使用信道的方式来传输数据。信道是建立在真实的TCP连接内的虚拟连接,且每条TCP连接上的信道数量没有限制。

5. 消息如何分发?


若该队列至少有一个消费者订阅,消息将以循环(round-robin)的方式发送给消费者。每条消息只会分发给一个订阅的消费者(前提是消费者能够正常处理消息并进行确认)。


6. 消息怎么路由?


从概念上来说,消息路由必须有三部分:交换器、路由、绑定。生产者把消息发布到交换器上;绑定决定了消息如何从路由器路由到特定的队列;消息最终到达队列,并被消费者接收。


  1. 消息发布到交换器时,消息将拥有一个路由键(routing key),在消息创建时设定。

  2. 通过队列路由键,可以把队列绑定到交换器上。

  3. 消息到达交换器后,RabbitMQ会将消息的路由键与队列的路由键进行匹配(针对不同的交换器有不同的路由规则)。

    如果能够匹配到队列,则消息会投递到相应队列中;

    如果不能匹配到任何队列,消息将进入 "黑洞"。


常用的交换器主要分为一下三种:

  • direct:

    如果路由键完全匹配,消息就被投递到相应的队列

  • fanout:

    如果交换器收到消息,将会广播到所有绑定的队列上

  • topic:

    可以使来自不同源头的消息能够到达同一个队列。

    使用topic交换器时,可以使用通配符,比如:

    "*" 匹配特定位置的任意文本, "." 把路由键分为了几部分,"#" 匹配所有规则等。

    特别注意:

    发往topic交换器的消息不能随意的设置选择键(routing_key),必须是由"."隔开的一系列的标识符组成。


7. 如何确保消息不丢失?


消息持久化的前提是:将交换器/队列的durable属性设置为true,表示交换器/队列是持久交换器/队列,在服务器崩溃或重启之后不需要重新创建交换器/队列(交换器/队列会自动创建)。


如果消息想要从Rabbit崩溃中恢复,那么消息必须:


  • 在消息发布前,通过把它的 "投递模式" 选项设置为2(持久)来把消息标记成持久化

  • 将消息发送到持久交换器

  • 消息到达持久队列


RabbitMQ确保持久性消息能从服务器重启中恢复的方式是,将它们写入磁盘上的一个持久化日志文件,当发布一条持久性消息到持久交换器上时,Rabbit会在消息提交到日志文件后才发送响应(如果消息路由到了非持久队列,它会自动从持久化日志中移除)。一旦消费者从持久队列中消费了一条持久化消息,RabbitMQ会在持久化日志中把这条消息标记为等待垃圾收集。如果持久化消息在被消费之前RabbitMQ重启,那么Rabbit会自动重建交换器和队列(以及绑定),并重播持久化日志文件中的消息到合适的队列或者交换器上。


8. 使用RabbitMQ有什么好处?


  • 应用解耦(系统拆分)

  • 异步处理(预约挂号业务处理成功后,异步发送短信、推送消息、日志记录等)

  • 消息分发

  • 流量削峰

  • 消息缓冲

  • ......


9. 其他


RabbitMQ是 消息投递服务,在应用程序和服务器之间扮演路由器的角色,而应用程序或服务器可以发送和接收包裹。其通信方式是一种 "发后即忘(fire-and-forget)" 的单向方式。


其中消息包含两部分内容:有效载荷(payload)和标签(label)

有效载荷是需要传输的数据,可以是任意内容。

标签描述了有效载荷,RabbitMQ会根据标签的描述,把消息发送给感兴趣的接收方。

以上是"RabbitMQ面试要点有哪些"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

消息 队列 消费 交换器 路由 消费者 生产 信道 日志 模式 生产者 应用 内容 应用程序 方式 程序 处理 服务 不同 服务器 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 网络技术本科学校 数据库性能 文本 网络安全技术支撑费用明细 计算机网络技术行业有几个大类 SDN服务器的数据库的搭建 软件开发专业技能怎么写 分布式文件服务器怎么做权限控制 删除数据库的日志文件 明日之后服务器地址 湖南建信互联网科技有限公司 福建中职计算机网络技术课程 mysql数据库建立用户 树牢备战打仗的网络安全观 vfp是数据库文件吗 政府如何提高网络安全意识 管理题中的服务器是什么意思 数据库文件备份的扩展名 泰州高性能服务器代理商 软件开发工程师题答案 手机网络安全管控意见建议 上海软件开发在职培训 服务器怎么查看后台管理入口 服务器的主要作用和特点 公司网络安全吗 登录服务器错误咋回事 工控软件开发简答题 aws服务器接受验证码超时 北京正规软件开发品质保障 软件安装时数据库连接失败 常用服务器的固定端口是什么
0