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. 消息怎么路由?
从概念上来说,消息路由必须有三部分:交换器、路由、绑定。生产者把消息发布到交换器上;绑定决定了消息如何从路由器路由到特定的队列;消息最终到达队列,并被消费者接收。
- 消息发布到交换器时,消息将拥有一个路由键(routing key),在消息创建时设定。
- 通过队列路由键,可以把队列绑定到交换器上。
- 消息到达交换器后,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及其面试关键点 【正文】: RabbitMQ作为一款广泛应用的消息中间件,它的核心价值在于实现消息队列的功能,有效地处理系统中的高并发和异步任务,从而提高系统的稳定性和响应速度。本文...
- **面试考察要点:** - 数据结构的选择依据。 - 线程安全问题及解决方案。 **1.2 IO** - **知识点概述:** - `InputStream`与`OutputStream`的基本使用。 - `Reader`与`Writer`之间的差异。 - `...
在Java大公司的面试过程中,技术要点通常涵盖广泛且深入,主要集中在基础理论、编程能力、设计模式、并发处理、框架应用、数据库操作、系统架构等多个方面。以下是对这些要点的详细解析: 一、基础理论 1. Java语法...
本资料"重点-复习专业技术点_java_面试复习要点_troublel75_cornerrj2_"正是为帮助求职者提升面试成功率而准备的。 首先,我们要关注的是基础语法。这是每个Java开发者必备的知识,包括但不限于变量、数据类型、...
Memcached+Redis+MongoDB、分布式通讯面试专题系列:ActiveMQ+RabbitMQ+Kafka、分布式限流面试专题系列:Nginx+zookeeper、集合、开源框架面试题系列:Spring+SpringMVC+MyBatis、23种设计模式知识要点整理、Dubbo、...
分布式通讯面试专题系列:ActiveMQ+RabbitMQ+Kafka 分布式数据库面试专题系列:Memcached+Redis+MongoDB 对标年薪60W的阿里P7 Java高频面试题库 Spring面试专题及答案整理文档 MySQL性能优化的21个最佳实践 JVM与...
由于提供的描述为空,我们将主要依据标签“源码”和“工具”来展开讨论,并结合常见的Java面试要点进行深入解析。 一、Java源码分析 Java作为阿里巴巴的主要开发语言之一,对源码的理解是面试中不可或缺的部分。...
除此之外,分布式系统设计、消息队列(如RabbitMQ、Kafka)、缓存技术(如Redis)和负载均衡策略也是面试中常被问及的话题。网络协议(TCP/IP、HTTP)、设计模式以及软件工程原则(SOLID原则)也是评价一个合格Java...
这份“拼多多Java笔试面试题.zip”资料包包含了丰富的Java技术要点和面试常见问题,旨在帮助应聘者提升自己的技能,顺利通过面试。 首先,Java基础是面试的必考项。这包括对Java语言特性的理解,如封装、继承、多态...
上述内容涵盖了大厂面试的全流程、技术要点、职业成长建议以及项目实施经验等多个方面,对于求职者来说,这些信息是获取大厂工作机会的宝贵资料,对于在职程序员来说,则是职业规划和技能提升的参考指南。
- 设计合理的消息队列模型,如RabbitMQ、Kafka等; - 实现消息的高效分发机制,考虑使用Fanout、Routing等模式; - 保障消息传递的可靠性和顺序性。 3. **亿级长连接、千万级连接网关架构设计** - **背景**:...
在准备阿里面试的过程中,Java开发者...通过阅读“阿里Java面试要点+以往题目.doc”文档,你可以更具体地了解面试的侧重点,针对性地进行复习和准备。在实践中不断应用和巩固这些知识,将有助于你在面试中脱颖而出。
这种格式可能还包括了对每个问题的解释,解题思路,以及可能的陷阱和注意事项,以帮助求职者更深入地理解问题背后的技术要点。 Java程序员在面试中可能会遇到以下知识点: 1. **基础知识**:Java语法、面向对象...
本篇将基于提供的"2023-Java面试资料汇总"来深入探讨Java相关的技术要点,包括JVM(Java虚拟机)、开源框架、集合、多线程、网络、微服务以及中间件等领域。 首先,我们来讨论JVM,它是Java程序运行的基础。JVM负责...
总的来说,"互联网大厂面试宝典"是一个全面且实用的学习资料,它可以帮助你掌握互联网行业最核心的技术要点,提高你在面试中的竞争力。通过深入学习和实践,你将能够更好地理解和应对大厂面试中可能出现的各种问题,...
- **面试必备**:提供面试准备的要点,可能包括常见面试问题、案例分析和自我介绍模板。 - **数据存储**:关注不同类型的存储系统,如关系数据库、NoSQL数据库、键值存储和列族数据库等。 - **其他**:可能包含其他...
《Java企业面试宝典》是一本全面覆盖Java技术面试核心要点的资料,旨在帮助求职者在面试中展现出扎实的技术功底。这份文档不仅适合正在准备面试的开发者,也适合想要巩固和提升Java知识的程序员进行自我学习。它包含...
这份"2023一线互联网大厂Java面试题...以上只是题集的部分内容,完整版将包含更多关于并发编程、Spring框架以及其他高级Java技术的题目,帮助求职者全面掌握面试要点,提升竞争力,从而提高获得心仪工作机会的可能性。
在准备面试各大IT公司的过程中,了解并掌握相关...以上内容只是部分要点,真正的面试可能还会涉及更多领域,如云计算、大数据、人工智能等。通过深入学习这些知识点,并结合实战经验,可以显著提升你在面试中的竞争力。