`

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会根据标签的描述,把消息发送给感兴趣的接收方。

 

1
0
分享到:
评论
3 楼 a1334480360 2019-01-29  
感谢整理,学习了
2 楼 我去啊注册都这么麻烦 2018-08-13  
[img][/img]
1 楼 我去啊注册都这么麻烦 2018-08-13  
引用

相关推荐

    rabbitmq笔记及面试要点

    【标题】:深入理解RabbitMQ及其面试关键点 【正文】: RabbitMQ作为一款广泛应用的消息中间件,它的核心价值在于实现消息队列的功能,有效地处理系统中的高并发和异步任务,从而提高系统的稳定性和响应速度。本文...

    java最新面试宝典

    - **面试考察要点:** - 数据结构的选择依据。 - 线程安全问题及解决方案。 **1.2 IO** - **知识点概述:** - `InputStream`与`OutputStream`的基本使用。 - `Reader`与`Writer`之间的差异。 - `...

    java大公司面试技术要点总结

    在Java大公司的面试过程中,技术要点通常涵盖广泛且深入,主要集中在基础理论、编程能力、设计模式、并发处理、框架应用、数据库操作、系统架构等多个方面。以下是对这些要点的详细解析: 一、基础理论 1. Java语法...

    重点-复习专业技术点_java_面试复习要点_troublel75_cornerrj2_

    本资料"重点-复习专业技术点_java_面试复习要点_troublel75_cornerrj2_"正是为帮助求职者提升面试成功率而准备的。 首先,我们要关注的是基础语法。这是每个Java开发者必备的知识,包括但不限于变量、数据类型、...

    Java程序员面试题全.zip

    Memcached+Redis+MongoDB、分布式通讯面试专题系列:ActiveMQ+RabbitMQ+Kafka、分布式限流面试专题系列:Nginx+zookeeper、集合、开源框架面试题系列:Spring+SpringMVC+MyBatis、23种设计模式知识要点整理、Dubbo、...

    最全的Java程序员知识(专业知识+面试+视频教程)学习资料合集.zip

    分布式通讯面试专题系列:ActiveMQ+RabbitMQ+Kafka 分布式数据库面试专题系列:Memcached+Redis+MongoDB 对标年薪60W的阿里P7 Java高频面试题库 Spring面试专题及答案整理文档 MySQL性能优化的21个最佳实践 JVM与...

    阿里 面试 题目

    由于提供的描述为空,我们将主要依据标签“源码”和“工具”来展开讨论,并结合常见的Java面试要点进行深入解析。 一、Java源码分析 Java作为阿里巴巴的主要开发语言之一,对源码的理解是面试中不可或缺的部分。...

    码神之路Java面试宝典2022最新版

    除此之外,分布式系统设计、消息队列(如RabbitMQ、Kafka)、缓存技术(如Redis)和负载均衡策略也是面试中常被问及的话题。网络协议(TCP/IP、HTTP)、设计模式以及软件工程原则(SOLID原则)也是评价一个合格Java...

    拼多多Java笔试面试题.zip_面试资料下载

    这份“拼多多Java笔试面试题.zip”资料包包含了丰富的Java技术要点和面试常见问题,旨在帮助应聘者提升自己的技能,顺利通过面试。 首先,Java基础是面试的必考项。这包括对Java语言特性的理解,如封装、继承、多态...

    字节阿里2021核心面试解读.pdf

    上述内容涵盖了大厂面试的全流程、技术要点、职业成长建议以及项目实施经验等多个方面,对于求职者来说,这些信息是获取大厂工作机会的宝贵资料,对于在职程序员来说,则是职业规划和技能提升的参考指南。

    专题04:架构设计面试题(卷王专供+ 史上最全 + 2023面试必备)-V105-from-尼恩Java面试宝典.pdf

    - 设计合理的消息队列模型,如RabbitMQ、Kafka等; - 实现消息的高效分发机制,考虑使用Fanout、Routing等模式; - 保障消息传递的可靠性和顺序性。 3. **亿级长连接、千万级连接网关架构设计** - **背景**:...

    阿里面试(java)

    在准备阿里面试的过程中,Java开发者...通过阅读“阿里Java面试要点+以往题目.doc”文档,你可以更具体地了解面试的侧重点,针对性地进行复习和准备。在实践中不断应用和巩固这些知识,将有助于你在面试中脱颖而出。

    面试常见题目程序员

    这种格式可能还包括了对每个问题的解释,解题思路,以及可能的陷阱和注意事项,以帮助求职者更深入地理解问题背后的技术要点。 Java程序员在面试中可能会遇到以下知识点: 1. **基础知识**:Java语法、面向对象...

    2023-Java面试资料汇总

    本篇将基于提供的"2023-Java面试资料汇总"来深入探讨Java相关的技术要点,包括JVM(Java虚拟机)、开源框架、集合、多线程、网络、微服务以及中间件等领域。 首先,我们来讨论JVM,它是Java程序运行的基础。JVM负责...

    互联网大厂面试宝典_值得你拥有_免积分下载

    总的来说,"互联网大厂面试宝典"是一个全面且实用的学习资料,它可以帮助你掌握互联网行业最核心的技术要点,提高你在面试中的竞争力。通过深入学习和实践,你将能够更好地理解和应对大厂面试中可能出现的各种问题,...

    Java相关、分布式架构、网络存储、数据结构与算法、面试相关等个人总结的MD文档

    - **面试必备**:提供面试准备的要点,可能包括常见面试问题、案例分析和自我介绍模板。 - **数据存储**:关注不同类型的存储系统,如关系数据库、NoSQL数据库、键值存储和列族数据库等。 - **其他**:可能包含其他...

    java企业面试宝典

    《Java企业面试宝典》是一本全面覆盖Java技术面试核心要点的资料,旨在帮助求职者在面试中展现出扎实的技术功底。这份文档不仅适合正在准备面试的开发者,也适合想要巩固和提升Java知识的程序员进行自我学习。它包含...

    2023一线互联网大厂Java面试题集

    这份"2023一线互联网大厂Java面试题...以上只是题集的部分内容,完整版将包含更多关于并发编程、Spring框架以及其他高级Java技术的题目,帮助求职者全面掌握面试要点,提升竞争力,从而提高获得心仪工作机会的可能性。

    各个大厂面试题汇总.zip

    在准备面试各大IT公司的过程中,了解并掌握相关...以上内容只是部分要点,真正的面试可能还会涉及更多领域,如云计算、大数据、人工智能等。通过深入学习这些知识点,并结合实战经验,可以显著提升你在面试中的竞争力。

Global site tag (gtag.js) - Google Analytics