面试篇六:消息中间件RabbbitMQ
- 使用RabbitMQ的好处
(1)使用消息队列可以将同步改成异步,可以解耦。
(2)可以通过消息队列设置最大请求数,超过阈值的抛弃或转到错误页面,避免服务器大量请求,导致服务器承压过大,以此来实现流量削峰。
(3)RabbitMQ采用的是信道通信,一个TCP连接可以容纳磁盘容量能承受范围内的多个信道,实现一次推送,多次消费,能减少TCP的连接次数,减少创建TCP和销毁造成的巨大资源浪费。
- RabbitMQ为什么要使用信道
多个线程在生产消息或消费消息时,没有信道,需要建立多个Connection,也就是TCP连接,而使用信道可以实现复用TCP连接,减少资源开销。
当信道流量不大时,可以只复用一个Connection,但当流量过大时,我们可以建立多个Connection,将信道均摊到这些Connection中。
- RabbitMQ的使用场景
在设计时,我们可以将一些无需即时返回且耗时的操作提取出来,改成用使用消息队列异步处理,以此来节省服务器的请求时间,提高系统的吞吐量,不影响服务器做其他相应。如:
付款数据,可以需要调用账户模块接口、预算模块接口、台账模块接口等一系列的处理流程,这时候可以把台账等不需要即时处理的数据提取处理,进行异步处理。
- RabbitMQ的高级特性:过期时间、消息确认、持久化、死信队列、延迟队列。
(1)RabbitMQ可以对消息和队列设置过期时间。如果两种方式一起使用,则过期时间以两者中较小的那个数值为准。
(2)RabbitMQ提供了消息确认机制,默认是自动确认模式(autoAck=false),也就是RabbitMQ发送消息出去后就自动确认,并从内存或硬盘删除消息,而不管是否被消息者消费。要解决RabbitMQ中消费者进程挂掉等导致的消息丢失,需设置autoAck参数为false。
(3)保证消息可靠性,需要持久化(写入磁盘),防止在异常情况下丢失数据。分为三个部分:交换器持久化、队列持久化和消息持久化。
交换器持久化:在声明队列时将durable参数设置为true,可以保证交换器元数据不丢失,且RabbitMQ服务重启后,消息还能正常发到这个交换器。
队列持久化:在声明队列时将durable参数设置为true,可以保证队列元数据不丢失,但不能保证消息不丢失。
消息持久化:在声明队列时将persistent参数设置为true,保证消息不丢失。
(4)死信队列:当消息在一个队列中变成死信之后,他能被重新发送到另一个交换器中,这个交换器为死信交换器,与该交换器绑定的队列称为死信队列。消息被拒绝、消息过期、队列达到最大长度都会变成死信。我们可以监听这个死信队列,来针对异常情况进行处理。
(5)延迟队列:进入该队列的消息会被消费者延迟消费。应用场景是延迟消费和延迟重试,比如消费者消费是吧,可以延迟一会后重试。
- SpringBoot与RabbitMQ整合
生存者发送消息,可以调用RabbitTemplate类中的convertAndSend(队列名, message);
消费者消费生产者消息步骤:
使用@RabbitListener监听队列、自动创建队列、对Exchange和Queue进行绑定,如自动创建队列:
@Component public class Consumer { @RabbitHandler @RabbitListener(queuesToDeclare = @Queue("rabbitmq_queue")) public void process(String message) { System.out.println("消费者消费消息=====" + message); } }
- RabbitMQ几种工作模式
- AMQP
生产者将消息发送到交换机,交换机按照特定的策略转发到队列进行存储。消费者也是通过交换机从队列获取消息。

浙公网安备 33010602011771号